在Android應用開發過程中,經常要對圖片做cache處理,比如從網路上下載圖片後儲存到sd卡裡,然後放到HashMap<String,Bitmap>裡同過ListView顯示,當HashMap裡的圖片很多時就會造成記憶體溢出的問題,網上的解決方案大多是要求顯示的調用Bitmap的recycle()方法釋放記憶體,但是Android官方網站上是不鼓勵調用recycle()方法的,而是由GC去做記憶體回收,通過測試,由於HashMap存放的圖片並不是順序存放的,很容易釋放掉ListView中正在顯示的圖片,這樣就會出錯。
下面介紹下我用的兩種方法避免出現記憶體溢出的問題。
1. 通過WeakHashMap<String,Bitmap>弱引用雜湊表存放圖片,其中key是圖片的URL,Value是對應下載的Bitmap,存放到SD卡的名字為URL的hashcode, 由於Android中的onLowMemory方法是系統記憶體不夠時才會觸發,應用程式一般超過Android系統規定的記憶體時,如8M,只會觸發OutOfMemoryError異常,onLowMemory()方法並不會調用,我這裡的解決方案並不是等到捕獲到OutOfMemoryError異常時才去調用WeakHashMap的clear方法, 而是通過檢測WeakHashMap中圖片的大小接近8M時去clear,讓系統GC釋放圖片。
2. 通過SoftReference引用圖片,交給系統釋放記憶體,
1) 定義imageCache = new HashMap<String, SoftReference<Drawable>>();
2) Add圖片 imageCache.put(imageUrl, new SoftReference<Bitmap>(bitmap));
3) Get圖片 SoftReference<Bitmap> softReference = imageCache.get(imageUrl);
Bitmap bitmap= softReference.get();