大家都知道static變數有很多好處就是可以在儲存全域資料。但是由此可能帶來很隱形BUG。
情況:
本人在開發一個項目的時侯有切身的體會,以下這個BUG尋找了很久才知道。由於多個人開發的項目。某個同事使用了static預先緩衝一些列表資料,方便下個介面使用。該資料儲存了一些圖片的引用,而這些圖片又單獨在另外一個列表儲存,但是在退出程式的時侯又把這些圖片Recycle(回收)了。
現象:
偶爾進入程式出現使用了已回收的圖片的問題。
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap
分析:
由於Android架構設計原因,在程式退出時,static資料並沒有立即得到清理。在上面的案例中可以發現,當積極式載入網路資料比較慢,再進入下一個介面時,發現static變數有資料。這個時侯就使用這個資料就是程式退出時的資料,但該資料引用的圖片已回收。就導致前面的現象發生。
解決:
在退出程式時,同時清空static變數裡面的資料。
建議:
在開發的過程中,盡量少使用static資料,盡量把static變數集中在一個類。(僅供參考)
延伸:
Android退出程式時,沒有把static資料立即清理的驗證。
public class TestStatic {
private static int nValue = 0;
static {
nValue += 100;
}
public TestStatic() {
nValue += 300;
Log.i("TestStatic", "nValue:"+nValue);
}
}
結果:
05-09 11:15:04.589: I/TestStatic(8093): nValue:400
05-09 11:15:08.309: I/TestStatic(8093): nValue:700
第一次進入程式時,先執行static代碼,再到TestStatic();
第二次進入程式時,直接執行TestStatic(),跳過了static代碼;