android上的主要数据模型

时间:2012-05-31 10:46:01

标签: android

我有一个包含许多活动的Android应用程序。 我有一个包含我的主数据模型的单例类,所有活动都可以访问以获取数据。

问题是有时候android GC会决定在应用程序在后台(当你按下主页按钮时)销毁我的单身人士。 无论如何,我可以绕过这个吗?

2 个答案:

答案 0 :(得分:1)

我当前的应用程序中存在这个确切的问题,需要在各种“单例”中保留大量数据。类。我遇到的问题与你的情况一样;即,有时当将应用程序带回到前台时,一些静态单例'课程已被销毁。

我认为问题在于“生命周期”。这些类的类别永远不能很好地定义或预测。毕竟,这是一个坐在那里的班级,他们持有自己的引用,所以当系统想要获取一些资源时,它很容易被垃圾收集。

您可能已经意识到扩展android.app.Application是使用传统单身人士的众所周知的替代方案。对我有用的解决方案是将数据单例类的实际实例保存在android.app.Application的扩展类中,其生命周期已明确定义。任何其他想要访问这些单例的类都可以使用Application类中的getter获取它们。

例如,我有一个名为AppState的类,它扩展了Application,用于保存实例:

import android.app.Application;

public class AppState extends Application {
    ...

    // "Singleton" instances that this Application extension looks after
    private MSData   singletonInstanceMSData;


    public AppState() {
        ...
        singletonInstanceMSData = new MSData();
        ...


    // ---------------- Singleton instance control ----------------

    public MSData getMSData(){
        return singletonInstanceMSData;
    }


    // I also provide the means to 'reset' the instances on startup (this is
    // something I need to do for my application - you may or may not need to)
    public void resetControllerSpecificData(){
        singletonInstanceMSData.reset();
        ...

如果您延长Application,请不要忘记您需要修改清单。

答案 1 :(得分:1)

AFAIR,lifeespan os singleton是他的类加载器的生命周期 - 也是完整的VM。当用户点击主页按钮时,你的应用程序进入backgorund并且可能被破坏 - 你不能对它做任何事情。你最好的办法就是保存你的onPause()回调中必要的东西(或者如果你真的偏执,只需在每次更改数据时使用写入)