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()时,将使用默认值Checkervalue1重新加载value2类。

确保Checker类与Activity保持一致的一种方法是在Activity类中保留对Checker实例的引用。当然,您也可以考虑重新设计Checker功能,以使其不依赖于静态成员行为。

关于android - 静态类变量的生命周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9929654/

10-10 14:28