Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 7.0和7.1 getApplication()ClassCastException_Android_Android 7.0 Nougat_Android Application Class - Fatal编程技术网

Android 7.0和7.1 getApplication()ClassCastException

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

在开发人员控制台中,我看到许多stacktrace崩溃,如下所示

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。