圖片的cache處理時出現內存溢出(OutOfMemoryError, OutOfMemory)的解決方法

在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(); 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章