静态类变量的生命周期

时间:2012-03-29 16:39:18

标签: android

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()会再次调用。那么为什么会这样呢?

2 个答案:

答案 0 :(得分:2)

根据您描述的症状,最可能发生的事情是Checker的ClassLoader正在收集垃圾,但您的Activity不会被垃圾收集。因此,当应用从后台返回时,活动将转到onResume。在调用Checker.check()后,Checker类将重新加载,其默认值为value1value2

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

答案 1 :(得分:0)

这很可能是由于活动不再存在造成的。如果它在后台,os可能会杀死它并在需要时重新启动它,所以在尝试完成()之前你需要检查它是否是!= null:)

if(value1!= value2&& activity!= null)     activity.finish();