对象在几个小时后消失(Android)

时间:2014-01-22 21:42:39

标签: android class object static

我有一个自定义对象列表...这些对象可以简单地监控我的一些网站,以获取用户可能添加的任何新数据。我将这些对象保存在静态List<>中这是最终类的成员....我创建了一个服务,以给定的间隔浏览列表并根据需要进行更新。

final public class MonitorHandler {
    public static List<MonitorSettings> monitorsSettings = new ArrayList<MonitorSettings>();

    ect....

}
一段时间内一切都运行得很好......根本没有例外。但是,如果我让应用程序运行一段时间..就像说过夜一样,列表是空的......就像对象被垃圾收集或被android删除一样。为什么是这样??即使应用程序关闭或发送到背景后,静态对象是否仍然存在?

3 个答案:

答案 0 :(得分:1)

  

为什么会这样?

您的流程已终止。

  

即使应用程序关闭或发送到背景后,静态对象是否仍然存在?

仅在进程运行时。一旦不再在前台,您的进程就可以终止。这需要几秒或几小时取决于设备的运行情况。

如果您要保留数据,请使用数据库,文件或SharedPreferences以持久方式存储。

答案 1 :(得分:1)

  

这是为什么?即使应用程序关闭或发送到背景后,静态对象是否仍然存在?

不,如果您的应用实际上已被系统关闭,则可能会发生这种情况。您应该登录Service.onDestroy()以确保这是真正的原因,但不能保证实际上会调用onDestroy。

因此,您应该将数据保存在某些存储中,最好是SharedPreferences或DB-sqlite。

答案 2 :(得分:0)

您没有显示足够的代码来确定,但除了MonitorHandler类的静态元素之外,很可能您没有在应用程序的任何位置持有对数据的引用。 Dalvik VM 不时地卸载未引用的类,因此下次访问该类时会重新加载,重新运行静态初始化,最后会得到一个新的空列表。

最重要的是,在Android应用程序执行期间可以依赖的 only 类是Application类本身。

如果要在应用程序中保留数据,唯一有效的方法是从Application类维护对它的引用。对于列表,最简单的方法是直接将它放入Application类。对于更复杂的数据,您可能希望创建一个单独类的实例,并在Application类中静态保存对它的引用。这是一个示例,显示了创建数据的两种不同方法,一种是静态的,一种是懒惰的。

import android.app.Application;
import android.content.Context;
import com.example.DiskLruImageCache;

import java.util.ArrayList;
import java.util.List;

public class TestApp extends Application {

    static final public int CACHE_SIZE = 1024 * 1024 * 15;        // 15MB
    private static List<String> stringList = new ArrayList<String>();
    private static DiskLruImageCache imageCache = null;
    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
    }

    public static List<String> getStringList() {
        return stringList;
    }

    static public DiskLruImageCache getImageCache() {
        if(imageCache == null) {
            synchronized(context) {
                if(imageCache == null)
                    imageCache = new DiskLruImageCache(context, "TestImages", CACHE_SIZE);
            }
        }
        return imageCache;
    }

}

现在,在您的活动或服务中,您只需拨打TestApp.getStringList()即可获取列表。只要应用程序正在运行,对此的任何更改都将保留。