2012-03-29 35 views
1
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(); 
    } 
} 

我得到了上面的類,並在主Activity的onCreate中調用了Checker.init(),並在我的代碼的各個位置調用了Checker.check()。問題是我在Checker.check()中得到了一個N​​ullPointerException異常,因爲activity.finish()在一段時間後重新打開應用程序時重新打開它。靜態類變量的生存期

通常value1 == value2,所以這個異常似乎表明所有的靜態變量都被重置爲默認值。我是一個Java/Android新手,但我認爲只要活動在內存中,並且在onCreate中終止活動並再次調用Checker.init(),就會保留這些變量。那麼爲什麼會發生?

+0

爲什麼不改變'check'的簽名來傳入'Activity',即'public static void check(Activity activity)'?想必你在你想完成的活動中調用「check」。 – 2012-03-29 16:45:54

+0

因爲這並不能解決問題。通常這行不應該執行,因爲value1 == value2。它只會由於靜態變量的明顯重置而被執行,因此value1!= value2。 – Ezekeel 2012-03-29 16:54:37

回答

2

根據您描述的症狀,最可能發生的情況是Checker的ClassLoader正在收集垃圾,但您的Activity未被垃圾收集。所以當應用程序從後臺返回時,活動將轉到onResume。當撥打電話Checker.check()時,Checker類將重新加載默認值value1value2

只要Activity保留對Activity類中的Checker實例的引用,就可以確保Checker類保持活動狀態的一種方法。當然,您也可以考慮重新設計Checker功能,以使其不依賴於靜態成員行爲。

+0

我已經嘗試在主要活動的onResume中放入Checker.init(),但這並沒有解決問題。我會看到如果在我的主要活動中初始化一個Checker實例會阻止該類被GC_d。 – Ezekeel 2012-03-29 18:14:35

0

這很可能是由於活動不再存在而引起的。如果它在後臺嘗試和完成()吧:)

如果(值之前的操作系統可能會殺死它並在需要時重新啓動它,所以你需要檢查它是否是!= NULL!=數值& & activity!= null) activity.finish();

+0

根據http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle,如果活動被kill onCreate等Checker.init()再次調用。 – Ezekeel 2012-03-29 16:58:46