为什么我的对象在此 class 中被垃圾收集
Why are my objects garbage-collected in this class
我有一个 class 从 API 加载数据并将结果存储/处理为 POJO。它看起来大致是这样的(省略了一些与问题无关的东西):
public class ResultLoader {
Search search;
Result result;
static ResultLoader instance;
private ResultLoader() {
}
public static synchronized ResultLoader getInstance() {
if (instance == null) {
instance = new ResultLoader();
}
return instance;
}
public void init(@NonNull Search search) {
this.search = search;
}
}
Result
对象可以变得太大以至于无法通过 Intents
传递给 Activities
,所以,如您所见,我设计了 ResultLoader
作为 Singleton
所以每个 class 都可以访问 Result
对象。
我通过 limiting background processes to one 模拟 Android 设备 运行 内存不足,然后切换一些应用程序,返回我的应用程序。
在我的 ResultLoader
的实例上,Result 对象变成了 null
或者实例被重新创建;我用
检查了这个
ResultLoader.getInstance().getResult() == null
这是怎么回事,我该怎么做才能防止这种情况发生?
在 android 中,由于多种原因(内存不足是其中之一),您的应用可以并且将会被重新创建。
查看此答案 here 以在自定义 class 上实施 saveinstancestate 行为。
您的对象已被 GC 处理,因为 android 终止了您的应用。所以它用静态数据销毁了所有加载的 classes。
下次当你回到你的应用程序时,新的应用程序被创建并且新的 ResultLoader class 加载了实例字段等于 null。当您尝试通过 getInstance 方法获取实例时,会创建一个结果为空的新实例。
您应该将结果保存到持久内存中。例如。当您获得结果时,将其保存到文件中。当您创建 ResultLoader 时,检查文件是否存在并从文件加载数据。或者,如果您的应用被终止,请重新加载结果。
我有一个 class 从 API 加载数据并将结果存储/处理为 POJO。它看起来大致是这样的(省略了一些与问题无关的东西):
public class ResultLoader {
Search search;
Result result;
static ResultLoader instance;
private ResultLoader() {
}
public static synchronized ResultLoader getInstance() {
if (instance == null) {
instance = new ResultLoader();
}
return instance;
}
public void init(@NonNull Search search) {
this.search = search;
}
}
Result
对象可以变得太大以至于无法通过 Intents
传递给 Activities
,所以,如您所见,我设计了 ResultLoader
作为 Singleton
所以每个 class 都可以访问 Result
对象。
我通过 limiting background processes to one 模拟 Android 设备 运行 内存不足,然后切换一些应用程序,返回我的应用程序。
在我的 ResultLoader
的实例上,Result 对象变成了 null
或者实例被重新创建;我用
ResultLoader.getInstance().getResult() == null
这是怎么回事,我该怎么做才能防止这种情况发生?
在 android 中,由于多种原因(内存不足是其中之一),您的应用可以并且将会被重新创建。
查看此答案 here 以在自定义 class 上实施 saveinstancestate 行为。
您的对象已被 GC 处理,因为 android 终止了您的应用。所以它用静态数据销毁了所有加载的 classes。 下次当你回到你的应用程序时,新的应用程序被创建并且新的 ResultLoader class 加载了实例字段等于 null。当您尝试通过 getInstance 方法获取实例时,会创建一个结果为空的新实例。
您应该将结果保存到持久内存中。例如。当您获得结果时,将其保存到文件中。当您创建 ResultLoader 时,检查文件是否存在并从文件加载数据。或者,如果您的应用被终止,请重新加载结果。