public class Checker {
static private int value1 = 0, value2 = 1;
static private Activity activity;
public static void init(Activity activity) {
Checker.activity = activity;
value1 = // calculate value
value2 = // calculate value, normally the same as value1
}
public static void check() {
if (value1 != value2)
activity.finish();
}
}
我得到了上面的类,并在主要活动的onCreate中调用了Checker.init(),并在我的代码的各个点调用了Checker.check()。问题是我在Checker.check()中为activity.finish()获取NullPointerException,当应用程序在后台运行一段时间后重新打开它。
通常value1 == value2,所以这个异常似乎表明所有的静态变量都被重置为默认值。我是一个Java / Android新手,但我认为这些变量只要活动在内存中就会保留,如果活动在onCreate上被杀死,那么Checker.init()会再次调用。那么为什么会这样呢?
答案 0 :(得分:2)
根据您描述的症状,最可能发生的事情是Checker的ClassLoader正在收集垃圾,但您的Activity不会被垃圾收集。因此,当应用从后台返回时,活动将转到onResume
。在调用Checker.check()
后,Checker
类将重新加载,其默认值为value1
和value2
。
只要Activity要在Activity类中保持对Checker实例的引用,就确保Checker类保持不变的一种方法。当然,您也可以考虑重新设计Checker功能,使其不依赖于静态成员行为。
答案 1 :(得分:0)
这很可能是由于活动不再存在造成的。如果它在后台,os可能会杀死它并在需要时重新启动它,所以在尝试完成()之前你需要检查它是否是!= null:)
if(value1!= value2&& activity!= null) activity.finish();