我有一个自定义对象列表...这些对象可以简单地监控我的一些网站,以获取用户可能添加的任何新数据。我将这些对象保存在静态List<>中这是最终类的成员....我创建了一个服务,以给定的间隔浏览列表并根据需要进行更新。
final public class MonitorHandler {
public static List<MonitorSettings> monitorsSettings = new ArrayList<MonitorSettings>();
ect....
}
一段时间内一切都运行得很好......根本没有例外。但是,如果我让应用程序运行一段时间..就像说过夜一样,列表是空的......就像对象被垃圾收集或被android删除一样。为什么是这样??即使应用程序关闭或发送到背景后,静态对象是否仍然存在?
答案 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()
即可获取列表。只要应用程序正在运行,对此的任何更改都将保留。