0

我在 Android 中有一个用于从 xml 加载的数据的单例。它有时会被回收,我不明白为什么。据我所知,单例应该存在于应用程序进程的整个生命周期中。这是我的单身人士:

public class DataLib {

    public static CategoryList categories = new CategoryList();
    public static RegionList regions = new RegionList();
    public static CompanyTypeList types = new CompanyTypeList();
    public static SearchData searchData = new SearchData();
    public static CompaniesList companies = new CompaniesList();

    private static RegionData currentRegion;

    private static final DataLib INSTANCE = new DataLib();

    protected DataLib() {
    }

    public static DataLib getInstance() {
        return INSTANCE;
    }

    public static void loadData() {
        loadCategories();
        loadRegions();
        loadTypes();
    }

    /* ... some more static functions are here ...*/
}

如您所见,它不是由任何活动直接实例化,而是由流程本身实例化。当应用程序启动时调用 DataLib.loadData() 来加载数据 = 加载数据时将结束的活动。

我无法确定是什么触发了回收 - 有时应用程序需要在后台停留更长时间,有时需要几分钟。我正在记录 DataLib 类的指针,所以我可以说它确实改变了 = 被回收了。

有任何想法吗?谢谢。

编辑:答案部分在标记的答案+评论中。

4

1 回答 1

3

它有时会被回收,我不明白为什么。

Android 将“不时”终止您的进程。

有时应用程序需要在后台停留更长时间,有时需要几分钟

操作系统和用户可以随时摆脱您的进程。单例和其他静态数据成员需要作为持久数据的缓存,使用后台线程等加载该数据。

如果您正在后台执行特定的工作,您应该使用 aService来向操作系统表明您正在后台独立于任何活动进行工作。这不会阻止 Android 终止您的进程(例如,应用户请求),但它会降低自行终止您的进程的可能性(即,操作系统将倾向于选择其他进程)。

于 2012-10-06T16:51:29.693 回答