【问题标题】:Application onCreate called(not called) after Activity onCreateActivity onCreate 后调用(未调用)应用程序 onCreate
【发布时间】:2018-12-04 06:47:15
【问题描述】:

在崩溃日志中,我发现了一些非常奇怪的应用程序错误,该错误发生在 android 7.0-8.0 上,对于少数用户来说,但非常频繁。我无法重现该问题,这里是反映当前应用程序状态的代码。

我的应用程序类有一个静态引用。

public class MyApplication extends Application {
   private static MyApplication sInstance;

   public static MyApplication get() {
      return sInstance;
   }

   @Override
   public void onCreate() {
      super.onCreate();
      sInstance = this;
   }
}

在主要活动中,我对单例进行了初始化:

public class MainActivity extends AppCompatActivity{

    public void onCreate(final Bundle savedInstanceState) {
        initSingletone();
        super.onCreate(createBundleNoFragmentRestore(savedInstanceState))
    }

    public void initSingleTone(){
        Singleton singleton = Singleton.getInstance(); 
    }
}

单身人士:

public class Singleton{

    public static Singleton instance;
    public static Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return ;
    }

    public Singleton(){
        Context context = MyApplication.get();
        final File baseDir = context.getCacheDir();
        ....
    }
}

NullPointerException 出现在下一行。

final File baseDir = context.getCacheDir();

因为某些原因,MyApplication.get() 返回 null。 似乎ApplicationonCreateMainActivityonCreate 的那一刻没有被调用,真的很奇怪。 有没有人遇到过同样的问题? Android组件的这种奇怪的初始化过程可能是什么原因?

【问题讨论】:

  • sInstance 声明在哪里?
  • @VikashBijarniya 更新了代码
  • 也分享您的清单
  • @sohaibkarim 请阅读说明,我无法重现我这边的问题,因此该应用程序运行良好。这意味着在应用程序清单中定义了 MyApplication。
  • 您是否在 AndroidManifest 文件中添加了应用程序名称为 MyApplication?

标签: java android


【解决方案1】:

您可以使用安全的方法:

public static MyApplication get() {
if(sInstance == null){
 sInstance = this;
 }
    return sInstance;
}

【讨论】:

  • 我不确定它是否安全,因为如果未调用 Application 中的 onCreate 可能意味着尚未初始化应用程序上下文,并且在尝试访问任何资源时可能会收到错误消息。
  • 这通常是看不到的,但如果它发生了,那么我们需要崩溃日志。并且在您的应用程序类未初始化时永远不可能访问资源。
  • 我认为您应该尝试禁用即时运行,然后清理项目并重新构建。 Instant Run 有多个奇怪的问题。
  • 如果应用实例上的 getResource 在实例的 super.attachBaseContext 执行之前被调用,应用将崩溃并出现 NullPointerExeption。
  • @VikashBijarniya 你不能在static 方法中返回this。那里没有thisStatic 方法在类的所有对象之间共享。
猜你喜欢
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多