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

22
demandé sur vandzi 2017-06-30 10:18:40

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/37137009

9
répondu John Sintal 2017-10-24 19:55:00

je pense que vous devriez cast getApplicationContext() en App à la place.

2
répondu Tuby 2017-06-30 07:24:40

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

0
répondu Vincent 2017-06-30 07:26:43

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

0
répondu Piyush Patel 2017-09-19 07:19:40

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.

0
répondu Ioane Sharvadze 2017-11-01 14:03:30