圖片的cache處理時出現記憶體溢出(OutOfMemoryError, OutOfMemory)的解決方案

來源:互聯網
上載者:User

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

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.