Android 7.0和7.1 getApplication()ClassCastException

在开发人员控制台中,我看到很多像这样的堆栈跟踪崩溃

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) 

BaseActivity的getApp方法是

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

应用程序类是

 public class App extends MultiDexApplication { ... 

并在清单应用程序标签中包含对此类的引用

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

98%的崩溃是为Android 7.0,其余是7.1。 没有其他的Android版本受到影响。

编辑:我使用proguard所以它可以以某种方式相关,但保持上课

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

注意:它可能不相关,但在相同的Android版本看起来像App的onCreate方法有时不被调用。 我观察到它,因为一些在onCreate中创build的对象在从Service(由AlarmManager启动)或BroadcastReceiver

有没有人知道什么可以导致它,如何解决或解决它? 谢谢

编辑2:我结束了这样的事情:

  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; } 

它至less不会崩溃,我可以检查getApp()== null

Solutions Collecting From Web of "Android 7.0和7.1 getApplication()ClassCastException"

由于getApplication()返回一个Application而不是所需的子类,因此投射失败。

我已经取得了一些成功,我发现了错误,并要求用户重新启动设备或重新安装应用程序。

不幸的是,这次罕见的事故并没有真正的解决办法。 Google不会修复与生命周期相关的问题,但表示在Android 7.1以上版本中这个问题有所减less。 来源: https : //issuetracker.google.com/issues/37137009

我认为你应该把getApplicationContext()转换成App

你应该像这样覆盖你的应用程序类中的attachBaseContext:

 @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } 

查看此链接了解更多信息: https : //developer.android.com/reference/android/support/multidex/MultiDexApplication.html

这可能有帮助

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

你不需要强制转换getApplication(),原因是你已经在Application类中,所以只需使用这个关键字来获得应用程序实例即可。 希望你find有用的

虽然我不能说这个解决scheme是否有效。

我认为,静态应用程序实例应该解决这个问题。

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

如果调用MyApp.getInstance() ,则不需要调用getActivity() 。 所以不应该有任何ClassCastException