代码如下:
public class MyTestHelperHelper {
static MyTestApi storeApi = null;
public static synchronized void initial(Application application) {
if (storeApi == null) {
storeApi = new MyTestApiImplImpl();
storeApi.initiImplal(application);
}
}
public static MyTestApi getInstance() {
return storeApi;
}
}
MyTestHelperHelper的初始方法在Application的onCreate中调用,它位于UI线程中。 MyTestHelperHelper的getInstance方法在Activity的onCreate中调用,它也在UI线程中。
在大多数情况下,它正常工作。但有时,它会使用MyTestHelperHelper的getInstance返回null,这会在我进行进一步操作时导致NPE。
虽然情况很少见,但我可以在崩溃报告中多次看到它。 我只是不太明白为什么:
除了初始方法外,没有写入“storeApi”。
initial和getInstance都在主线程中,因为在Application onCreate中调用了initial,在Activity onCreate中调用了getInstance。
似乎NPE仅在
时发生1.process启动时没有应用程序的oncreate。 OR
2.当内存不足时,许多过程数据(包括静态变量,类加载器,类等)都会被清除,除非应用程序实例停留在进程中。有可能吗?
答案 0 :(得分:1)
新进程不可能并且不会调用Application.onCreate()
。
每当创建一个进程时,都会调用Application.onCreate()
。
但是在某些情况下,静态变量的生命周期可能会受到影响。
静态变量的生命周期开始于JVM加载的类,并以卸载的类结束。
只要下列其中一项不会发生,静态变量将保持活动状态:
由于内存不足,该类被卸载。
注意:在这种情况下,Application对象仍然存在,因为它将是要释放的最后一个对象。此解除分配不能由应用程序控制,而是由OS确定。如果您的应用程序处于后台并且操作系统想要放弃内存,则可能会发生这种情况。
您可以使用onSaveInstanceState()
和onRestoreInstanceState()
分别保存和恢复静态变量的状态。