android 在活动onCreate之后调用(未调用)应用程序onCreate

hmtdttj4  于 2023-02-27  发布在  Android
关注(0)|答案(2)|浏览(205)

在崩溃日志中,我发现了非常奇怪的应用程序错误,发生在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组件初始化过程如此奇怪的原因是什么?

s8vozzvw

s8vozzvw1#

sInstance = this;移动到构造函数。
onCreate()太晚。
在我看来,这是一个Android bug,如果应用程序的onCreate()还没有完成执行,没有明显的理由对Activity做任何事情。

ars1skjm

ars1skjm2#

您可以使用安全的方法:

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

相关问题