为什么我的对象在这个类中被垃圾收集

时间:2015-01-30 14:28:02

标签: java android garbage-collection singleton

我有一个类从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

这怎么可以,我该怎么做才能防止这种情况发生?

2 个答案:

答案 0 :(得分:1)

你的对象GC'ed因为android杀了你的应用程序。所以它用静态数据销毁了所有加载的类。 下次当您返回应用程序时,创建的新应用程序和使用实例字段加载的新ResultLoader类等于null。当您尝试通过getInstance方法获取实例时,使用空结果创建新实例。

您应该将结果保存到持久性内存中。例如。当你得到结果时将它保存到文件中。当您创建ResultLoader时,检查该文件是否存在并从文件加载数据。或者如果您的应用程序被杀,请再次加载结果。

答案 1 :(得分:0)

在Android中,您的应用程序可以并且将会因为多种原因(低内存是其中之一)而重新创建。

请参阅此答案here以在自定义类上实现saveinstancestate行为。