0

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

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

4

2 回答 2

1

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

我认为,问题在于此类课程的“生命周期”永远无法很好地定义或预测。毕竟,它是一个持有对自身的引用的类,所以当系统想要获取一些资源时,它很容易被垃圾收集。

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

因此,例如,我有一个名为AppStateextends的类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

于 2012-05-31T10:51:22.613 回答
1

AFAIR,lifespan os singleton 是他的类加载器的寿命 - 也是完整的 VM 。当用户点击主页按钮时,您的应用程序进入后台并可能被破坏 - 您无法对它做任何事情。你最好的选择是在你的 onPause() 回调中保存任何必要的东西(或者如果你真的偏执,就在每次更改 datza 时使用 write through)

于 2012-05-31T11:30:05.307 回答