gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:49:41 24 4
gpt4 key购买 nike

代码如下:

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都在主线程中,因为initial是在Application onCreate中调用的,而getInstance是在Activity onCreate中调用的。

  3. 如果我的应用程序在后台并且进程被终止,我认为应用程序会在带到前台时重新创建,因此会调用初始值。

似乎 NPE 仅在以下情况下发生

1.进程启动时没有应用程序的oncreate。或者

2.当内存不足时,很多进程数据,包括静态变量、类加载器、类等都会被清理,除了应用程序实例留在进程中。可能吗?

最佳答案

不可能是新创建的进程没有调用Application.onCreate()

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

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

静态变量的生命周期从类被JVM加载开始到类被卸载结束。

只要不发生以下情况之一,静态变量就会保持 Activity 状态:

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

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

  2. 进程被终止 -> 静态对象和应用程序对象都被释放。

您可以使用onSaveInstanceState()onRestoreInstanceState() 分别保存和恢复静态变量的状态。

关于Android:为什么在 Activity onCreate 上将静态变量设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49744760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com