Android 7.0 et 7.1 Getapplication () ClassCastException
les Développeurs de la Console, je vois beaucoup de plantages avec stacktrace comme ceci
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)
getApp méthode de BaseActivity est
public App getApp() {
return (App) getApplication();
}
la classe App est
public class App extends MultiDexApplication { ...
et dans le manifeste de l'application de la balise contient une référence à cette classe
<application
android:name="com.myapp.App"
98% des accidents est pour android 7.0, le reste est 7.1. Aucune autre version d'android n'est affectée.
EDIT: j'ai utiliser proguard de sorte qu'il peut être en quelque sorte lié, mais en gardant classe
-keep class com.myapp.** { *;}
-keep interface com.myapp.** { *;}
Note: il peut ne pas être lié mais dans les mêmes versions android, il semble que la méthode onCreate de L'application n'est parfois pas appelé. Je l'ai observé parce que certains objets qui sont créés en onCreate étaient nuls quand ils étaient accessibles depuis le Service (démarré par AlarmManager) ou le Diffusreceiver
est-ce que quelqu'un a une idée de ce qui peut causer cela, comment le réparer ou travailler autour de lui? Merci
Modifier 2: Je me suis retrouvé avec quelque chose comme ceci:
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;
}
Il au moins ne se plante pas et je peux vérifier getApp () = = null
5 réponses
Casting échoue parce que getApplication()
retourne un Application
et pas la sous-classe désirée.
j'ai eu un certain succès, où j'ai pris l'erreur et demandé à l'utilisateur de redémarrer leur appareil ou de réinstaller l'application.
https://issuetracker.google.com/issues/37137009je pense que vous devriez cast getApplicationContext()
en App
à la place.
Vous devriez annuler attachBaseContext dans votre classe d'application comme ceci:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
suivez ce lien pour plus d'informations: https://developer.android.com/reference/android/support/multidex/MultiDexApplication.html
Cela peut aider
public class App extends MultiDexApplication {
public static App app = null;
public static App getInstance() {
return app;
}
@Override
public void onCreate() {
super.onCreate();
app = this;
}
}
Vous n'avez pas besoin de lancer getApplication(), la raison est que vous êtes déjà dans la classe Application alors utilisez simplement ce mot-clé pour obtenir l'instance application. J'espère que vous trouverez utile
alors que je ne peux pas dire si cette solution fonctionne.
je pense que statique instance d'Application devrait résoudre le problème.
class MyApp extends Application {
private static final sInstance;
public void onCreate() {
sInstance = this;
}
public static MyApp getInstance() {
return sInstance;
}
}
au lieu d'appeler getActivity()
si vous appelez MyApp.getInstance()
vous ne devriez pas avoir à lancer. Donc, il ne devrait pas y avoir ClassCastException
plus.