26

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

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。其他安卓版本不受影响。

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

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

注意:它可能不相关,但在相同的 android 版本中,看起来 App 的 onCreate 方法有时没有被调用。我观察到它是因为在 onCreate 中创建的某些对象在从 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;
}

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

4

5 回答 5

13

转换失败,因为getApplication()返回一个Application而不是所需的子类。

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

不幸的是,这种罕见的崩溃没有真正的解决方法。谷歌不会修复与生命周期相关的问题,但表示它在 Android 7.1+ 中有所减少。来源:https ://issuetracker.google.com/issues/37137009

于 2017-10-10T22:22:36.297 回答
1

我认为你应该改为getApplicationContext()投入App

于 2017-06-30T07:24:40.343 回答
0

您应该像这样在应用程序类中覆盖 attachBaseContext:

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

检查此链接以获取更多信息:https ://developer.android.com/reference/android/support/multidex/MultiDexApplication.html

于 2017-06-30T07:26:43.690 回答
0

这可能会有所帮助

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 类中,因此只需使用此关键字即可获取应用程序实例。希望你觉得有用

于 2017-09-19T07:19:40.340 回答
0

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

我认为静态应用程序实例应该可以解决问题。

class MyApp extends Application {
  private static final sInstance;

  public void onCreate() {
    sInstance = this;
  }

  public static MyApp getInstance() {
    return sInstance;
  }
}

getActivity()如果你打电话,而不是打电话,MyApp.getInstance()你不应该需要施放。所以应该没有ClassCastException 了。

于 2017-11-01T14:03:30.583 回答