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()。问题是在后台运行一段时间后重新打开应用程序时,我在Activity.finish()的Checker.check()中得到了NullPointerException异常。
通常为value1 == value2,因此此异常似乎表明所有静态变量都已重置为默认值。我是Java / Android新手,但是我认为只要活动处于内存中就可以保留这些变量,以防活动被onCreate杀死,因此再次调用Checker.init()。那么为什么会这样呢?
最佳答案
根据您描述的症状,最有可能发生的是Checker的ClassLoader正在获取垃圾,而您的Activity没有被垃圾收集。因此,当应用程序从后台返回时,活动将转到onResume
。调用Checker.check()
时,将使用默认值Checker
和value1
重新加载value2
类。
确保Checker类与Activity保持一致的一种方法是在Activity类中保留对Checker实例的引用。当然,您也可以考虑重新设计Checker功能,以使其不依赖于静态成员行为。
关于android - 静态类变量的生命周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9929654/