BitMap的recycle問題

   雖然Android有自己的垃圾回收機制,對於是不是要我們自己調用recycle,還的看情況而定。如果只是使用少量的幾張圖片,回收與否關係不大。可是若有大量bitmap需要垃圾回收處理,那必然垃圾回收需要做的次數就更多也發生地更頻繁,會對系統資源造成負荷。所以,這個時候還是自己試用recycle來釋放的比較好。

    如何去使用recycle()方法和何時試用recycle()都是值得考慮的問題。否側,極易出現下面的異常:

[java] view plain copy
  1. 05-15 08:31:00.117: E/AndroidRuntime(513): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@44c093b8  
java運行時異常:試圖使用一個已經回收了的圖片


  只有當你確認你不會在使用這個bitmap的時候,就可以選擇調用recycle()方法釋放它。

  今天在做個小測試的時候,就因爲recycle()的調用出現了異常。原因是:

在xml文件中,ImageView有兩個方法來設置一張顯示的圖片:

[java] view plain copy
  1. android:background="@drawable/aa"  
  2. android:src="@drawable/aa"  

剛開始,我使用background,然後在程序中,這樣設置

[java] view plain copy
  1.                      // 獲得ImageView當前顯示的圖片  
  2. Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();  
  3.   
  4. Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 00, bitmap1.getWidth(),  
  5.         bitmap1.getHeight(), matrix, true);  
  6. // 如果圖片還沒有回收,強制回收  
  7. if (!bitmap1.isRecycled()) {  
  8.     bitmap1.recycle();  
  9. }  
  10. // 根據原始位圖和Matrix創建新的圖片  
  11. imageView.setImageBitmap(bitmap2);  

因爲imageView.setImageBitmap()方法設置的是對應的src的圖片,而不是background。而我卻把background的圖片給回收了。這樣,就導致了異常的發生。

所以修改成如下的代碼,去調用setBackGround()方法

[java] view plain copy
  1.                     // 獲得ImageView當前顯示的圖片  
  2. Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();  
  3. Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 00, bitmap1.getWidth(),  
  4.         bitmap1.getHeight(), matrix, true);  
  5. // 如果圖片還沒有回收,強制回收  
  6. if (!bitmap1.isRecycled()) {  
  7.     bitmap1.recycle();  
  8. }  
  9. // 根據原始位圖和Matrix創建新的圖片  
  10. //imageView.setImageBitmap(bitmap2);  
  11. imageView.setBackgroundDrawable(new BitmapDrawable(bitmap2));  

所以,一定要注意ImageView圖片的來源問題,然後在進行相應的recycle。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章