編輯:關於Android編程
大家都知道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代碼;
關於String相關知識都是老掉牙的東西了,但我們經常可能在不經意的String 字符串拼接的情況下浪費內存,影響性能,也常常會成為觸發內存OOM的最後一步。所以本文對
前幾天完成了一個客戶端小功能,使用html頁面登錄, 拿到cookie之後,傳遞給httpclient完成業務邏輯的訪問,現在把基本的流程整理記錄一下。 首先來一張a
Android自定義動態布局 — 多圖片上傳 本文介紹Android中動態布局添加圖片,多圖片上傳。 項目中效果圖: 技術點
Bitmap src = BitmapFactory.decodeResource(getResources(), imageId); //獲取Bitmap圖片Round