Android:为什么静态变量在Activity onCreate上设置为null

时间:2018-04-10 03:17:46

标签: android nullpointerexception

代码如下:

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。

虽然情况很少见,但我可以在崩溃报告中多次看到它。 我只是不太明白为什么:

  1. 除了初始方法外,没有写入“storeApi”。

  2. initial和getInstance都在主线程中,因为在Application onCreate中调用了initial,在Activity onCreate中调用了getInstance。

  3. 如果我的应用程序处于后台并且进程被终止,我认为应用程序将在转到前台时重新创建,因此调用初始化。
  4. 似乎NPE仅在

    时发生

    1.process启动时没有应用程序的oncreate。 OR

    2.当内存不足时,许多过程数据(包括静态变量,类加载器,类等)都会被清除,除非应用程序实例停留在进程中。有可能吗?

1 个答案:

答案 0 :(得分:1)

新进程不可能并且不会调用Application.onCreate()

每当创建一个进程时,都会调用Application.onCreate()

但是在某些情况下,静态变量的生命周期可能会受到影响。

静态变量的生命周期开始于JVM加载的类,并以卸载的类结束。

只要下列其中一项不会发生,静态变量将保持活动状态:

  1. 由于内存不足,该类被卸载。

    注意:在这种情况下,Application对象仍然存在,因为它将是要释放的最后一个对象。此解除分配不能由应用程序控制,而是由OS确定。如果您的应用程序处于后台并且操作系统想要放弃内存,则可能会发生这种情况。

  2. 该过程被杀死 - >静态对象和Application对象都被取消分配。
  3. 您可以使用onSaveInstanceState()onRestoreInstanceState()分别保存和恢复静态变量的状态。