android - 只要服务存在,如何持有一个对象?

标签 android service singleton

我有一个在所有 Activity 中都使用的对象,其中包含很多复杂的数据,使用 Android 框架保存对象状态并将其从一个 Activity 传递到另一个 Activity 会很麻烦,所以我我认为可以创建一个单例来管理该对象并使其在应用程序存在时一直存在。

尝试使用常规的 Java Singleton 方案,具有普通的类和普通的静态实例,但实例在一段时间后变为 null(这很令人困惑,为什么仍然引用的对象会变为 null 并被垃圾收集?) .所以我决定与 Android 设计师一起创建一个服务来管理这个对象,这个服务看起来像这样:

public class DataService extends Service {
    private Data data;
    private static DataService instance;
    @Override
    public void onCreate() {
        instance = this;
        data= new Data(...);
        instance.data.addProgressListener(listener);
        (new Thread() {
            @Override
            public void run() {
                data.doInitProgress();
                listener = null;
            };
        }).start();

    }


    public static void listenToInitDataProcess(final ProgressBar progressBar,final Runnable onDone) {

        listener = new ProgressListener() {
            private int progress;
            private int max;
            @Override
            public void onUpdateProgress(final long i) {
                progressBar.setProgress(progress+=i);
            }

            @Override
            public void onProgressEndComputed(final long n) {
                progressBar.setMax(max=(int) n);
            }

            @Override
            public void onDone() {
                progressBar.setProgress(max);
                onDone.run();
            }
        };
            if (instance!=null) instance.data.addProgressListener(listener);
    }

    public static Data getData() {
        return instance.data;
    }
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
}

现在的问题是,应用程序运行一段时间后,我得到了由实例引起的 NPE 为空...请注意,我正在监听数据对象的创建,并且我只是在它被创建后才尝试获取它一旦启动,那么该实例不可能为空...

那怎么办呢?

最佳答案

如果你想要一个与你的应用程序一样长寿的对象(即只要它的进程没有被操作系统杀死)你可以扩展android.app.Application,把你的'global'那里的数据并将该子类用作您的应用程序上下文(需要在 list 中声明)

然而,许多人认为单例提供的结果与自定义上下文基本相同,例如
Singletons vs. Application Context in Android?

关于android - 只要服务存在,如何持有一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19855342/

相关文章:

java - 我怎样才能拥有从 Java 中的抽象基类型派生的 Singleton?

java - 通知在特定时间自动取消

android - 长时间运行的后台任务,Android

android - (Android) 是否有可靠的信号表明网络 channel 是可路由的?

android - API 23 后警报管理器未按预期启动服务

android - 如何在 Android 中停止我的 VPN 服务?

ios - bool 属性上的 KVO,不调用 observeValueForKeyPath

java - 单例模式: Multiton?

android-asynctask - 在 AsyncTask 的 getApplication() 上找不到符号

android - ScrollView OnScrollChangedListener