我有一个类从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
对象可能会变得太大而无法通过Activities
传递到Intents
,因此,正如您所看到的,我设计了ResultLoader
作为Singleton
,所以每个类都可以访问Result
对象。
我通过limiting background processes to one模拟内存不足的Android设备,然后切换一些应用,返回我的应用。
在我的ResultLoader
实例上,结果对象变为null
或重新创建了实例;我用
ResultLoader.getInstance().getResult() == null
这怎么可以,我该怎么做才能防止这种情况发生?
答案 0 :(得分:1)
你的对象GC'ed因为android杀了你的应用程序。所以它用静态数据销毁了所有加载的类。 下次当您返回应用程序时,创建的新应用程序和使用实例字段加载的新ResultLoader类等于null。当您尝试通过getInstance方法获取实例时,使用空结果创建新实例。
您应该将结果保存到持久性内存中。例如。当你得到结果时将它保存到文件中。当您创建ResultLoader时,检查该文件是否存在并从文件加载数据。或者如果您的应用程序被杀,请再次加载结果。
答案 1 :(得分:0)
在Android中,您的应用程序可以并且将会因为多种原因(低内存是其中之一)而重新创建。
请参阅此答案here以在自定义类上实现saveinstancestate行为。