Android 7.0和7.1 getApplication()ClassCastException
在开发人员控制台中,我看到许多stacktrace崩溃,如下所示Android 7.0和7.1 getApplication()ClassCastException,android,android-7.0-nougat,android-application-class,Android,Android 7.0 Nougat,Android Application Class,在开发人员控制台中,我看到许多stacktrace崩溃,如下所示 java.lang.RuntimeException: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2984) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045) at android.app.ActivityThre
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"
注意:它可能不相关,但在相同的android版本中,看起来应用程序的onCreate方法有时不被调用。我之所以观察到这一点,是因为在onCreate中创建的一些对象在从服务(由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;
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
它至少不会崩溃,我可以检查getApp()==null我认为您应该将
getApplicationContext()
转换为App
。您应该在应用程序类中重写attachBaseContext,如下所示:
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;
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
查看此链接了解更多信息:这可能会有所帮助
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(),原因是您已经在应用程序类中,所以只需使用此关键字即可获取应用程序实例。希望您发现有用的强制转换失败,因为
getApplication()
返回的是一个应用程序
,而不是所需的子类
我成功地发现了错误,并要求用户重新启动设备或重新安装应用程序
不幸的是,这起罕见的车祸没有真正的解决办法。谷歌不会解决与生命周期相关的问题,但表示会在安卓7.1+中减少。来源:但我不能说这个解决方案是否有效 我认为静态应用程序实例应该解决这个问题
class MyApp extends Application {
private static final sInstance;
public void onCreate() {
sInstance = this;
}
public static MyApp getInstance() {
return sInstance;
}
}
如果调用MyApp.getInstance()
则不需要调用getActivity()
。所以不应该有任何ClassCastException
再也没有了 我不必这样做,因为它已经在多索引应用程序中完成了。在您共享的链接中,说明您可以扩展多索引应用程序或覆盖attachBaseContext@vandzi你能把你的应用程序类发布到onCreate上吗?那里没有什么有用的东西,只有super.onCreate();分析初始化。我认为问题出在其他地方,我重新创建了您的实现,它在android 7.0上对我有效,我认为问题出在其他地方,它并不总是崩溃。它只会对某些设备/用户崩溃,可能是随机崩溃。请解释一下为什么它会有帮助?这是一种替代方法,有时在为android编程时,我经历过这样的小变化可以消除异常。问题是,在某些情况下,它可能不会返回应用程序对象(即android的供应商实现)嗨,你找到解决办法了吗?@user5599807不幸的是,这种崩溃有多普遍?总是会有一些奇怪的、罕见的、特定于供应商/rom的崩溃。我在Android 8.0和8.1上也看到了这个问题。getApp在活动中,所以我必须强制转换它,尽管您不需要在活动中强制转换use getApplicationContext(),getApplicationContext()返回单个的上下文,当前进程的全局应用程序对象。我不想获取上下文。我想获取我已回答的应用程序实例。你需要阅读上面的陈述。全局应用程序对象(即应用程序实例)这并没有提供问题的答案。一旦你有足够的钱,你将能够;相反我认为我新编辑的答案为OP的问题提供了答案。同意+从我这里得到1。