Android手動回收bitmap,引發Canvas: trying to use a recycled bitmap處理

來源:互聯網
上載者:User

標籤:graphics   keyword   runtime   圖片緩衝   設定   圖片   group   cache   override   

在做Android的開發的時候,在ListView 或是 GridView中需要載入大量的圖片,為了避免載入過多的圖片引起OutOfMemory錯誤,設定了一個圖片緩衝列表 Map<String, SoftReference<Bitmap>> imageCache , 並對其進行維護,在圖片載入到一定數量的時候,就手動回收掉之前載入圖片的bitmap,此時就引起了如下錯誤:

 

Java代碼  
  1. java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@41de4380  
  2.     at android.graphics.Canvas.throwIfRecycled(Canvas.java:1026)  
  3.     at android.graphics.Canvas.drawBitmap(Canvas.java:1127)  
  4.     at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:393)  
  5.     at android.widget.ImageView.onDraw(ImageView.java:961)  
  6.     at android.view.View.draw(View.java:13458)  
  7.     at android.view.View.draw(View.java:13342)  
  8.     at android.view.ViewGroup.drawChild(ViewGroup.java:2929)  
  9.     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)  
  10.     at android.view.View.draw(View.java:13461)  
  11.     at android.view.View.draw(View.java:13342)  

 

 

圖片手動回收部分代碼:

 

Java代碼  
  1. Bitmap removeBitmap = softReference.get();  
  2. if(removeBitmap != null && !removeBitmap.isRecycled()){  
  3.     removeBitmap.recycle(); //此句造成的以上異常  
  4.     removeBitmap = null;  
  5. }  

 

網上有好多人說應該把recycle()去掉,個人認為去掉後會引起記憶體持續增長,雖然將bitmap設定為了null,但是系統並沒有對其進行真正的回收,仍然佔有記憶體,即是調用了System.gc() 強制回後以後,記憶體仍然沒有下去,如果依靠記憶體達到上限時系統自己回收的話,個人覺得太晚了,已經對應用造成了影響,應用應該是比較卡了,所以還是贊同加上bitmap.recycle() ,但是又會引起  Canvas: trying to use a recycled bitmap 異常,困擾了很久,開始嘗試從其它方面著手來解決這個問題,即然是異常就應該能夠捕獲到,但是在Adapter裡的getView()方法裡進行捕獲的時候,時機晚了,沒有捕獲到。現在換到在ImageView的onDraw()裡進行捕獲,上面的異常能夠捕獲。

 

解決方案(繼承ImageView 重寫onDraw()方法,捕獲異常):

在重寫onDraw()方法中,其實什麼都沒有做,只是添加了一個異常捕獲,即可捕捉到上面的錯誤

Java代碼  
  1. import android.content.Context;  
  2. import android.graphics.Canvas;  
  3. import android.util.AttributeSet;  
  4. import android.widget.ImageView;  
  5.   
  6. /** 
  7.  * 重寫ImageView,避免引用已回收的bitmap異常 
  8.  *  
  9.  * @author zwn 
  10.  *  
  11.  */  
  12. public class MyImageView extends ImageView {  
  13.   
  14.     public MyImageView (Context context, AttributeSet attrs) {  
  15.         super(context, attrs);  
  16.     }  
  17.   
  18.     @Override  
  19.     protected void onDraw(Canvas canvas) {  
  20.         try {  
  21.             super.onDraw(canvas);  
  22.         } catch (Exception e) {  
  23.             System.out  
  24.                     .println("MyImageView  -> onDraw() Canvas: trying to use a recycled bitmap");  
  25.         }  
  26.     }  
  27.   

Android手動回收bitmap,引發Canvas: trying to use a recycled bitmap處理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.