oreo notes android android-7.0-nougat android-application-class

notes - android api 24



Android 7.0 y 7.1 getApplication() ClassCastException (5)

Creo que deberías convertir getApplicationContext() en la App .

En la Consola de desarrollador veo muchos bloqueos con stacktrace como este

java.lang.RuntimeException: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2984) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045) at android.app.ActivityThread.-wrap14(ActivityThread.java:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1642) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6776) at java.lang.reflect.Method.invoke(Native Method:0) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) Caused by: java.lang.ClassCastException: at com.myapp.ui.BaseActivity.getApp(BaseActivity.java:193) at com.myapp.ui.BaseActivity.onCreate(BaseActivity.java:275) at com.myapp.ui.CastActivity.onCreate(CastActivity.java:39) at com.myapp.ui.MainActivity.onCreate(MainActivity.java:268) at android.app.Activity.performCreate(Activity.java:6955) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927)

El método getApp de BaseActivity es

public App getApp() { return (App) getApplication(); }

Clase de aplicación es

public class App extends MultiDexApplication { ...

y en la etiqueta de aplicación de manifiesto contiene referencia a esta clase

<application android:name="com.myapp.App"

El 98% de los choques es para Android 7.0, el resto es 7.1. No hay otras versiones de Android afectadas.

EDITAR: uso proguard para que pueda estar relacionado de alguna manera pero manteniendo la clase

-keep class com.myapp.** { *;} -keep interface com.myapp.** { *;}

Nota: Puede que no esté relacionado, pero en las mismas versiones de Android parece que a veces no se llama el método onCreate de la aplicación. Lo observé porque algunos objetos que se crearon en onCreate eran nulos cuando se accedía desde Service (iniciado por AlarmManager) o BroadcastReceiver

¿Alguien tiene idea de qué puede causarla, cómo solucionarlo o solucionarlo? Gracias

EDIT 2: terminé con algo como esto:

public App getApp() { Application application = getApplication(); App app = null; try { app = (App) application; } catch (Exception e) { if (application != null) { Log.e(TAG, "getApp Exception: application class: " + application.getClass().getName()); } else { Log.e(TAG, "getApp Exception: application object is null"); } } return app; }

Al menos no falla y puedo verificar getApp () == null



Esto podría ayudar

public class App extends MultiDexApplication { public static App app = null; public static App getInstance() { return app; } @Override public void onCreate() { super.onCreate(); app = this; } }

no es necesario que emita getApplication (), la razón es que ya se encuentra en la clase de Aplicación, así que simplemente use esta palabra clave para obtener la instancia de la aplicación. Espero que te sea de utilidad


La getApplication() falla porque getApplication() devuelve una Application y NO la subclase deseada.

He tenido cierto éxito cuando detecté el error y le pedí al usuario que reinicie su dispositivo o que vuelva a instalar la aplicación.

Desafortunadamente, no hay una solución real para este raro accidente. Google no solucionará el problema relacionado con el ciclo de vida, pero dijo que se redujo en Android 7.1+. Fuente: https://issuetracker.google.com/issues/37137009


Si bien no puedo decir si esta solución funciona.

Creo que la instancia de aplicación estática debería resolver el problema.

class MyApp extends Application { private static final sInstance; public void onCreate() { sInstance = this; } public static MyApp getInstance() { return sInstance; } }

En lugar de llamar a getActivity() si llama a MyApp.getInstance() no debería tener que convertir. Así que ya no debería haber ninguna ClassCastException .