雖然Android有自己的垃圾回收機制,對於是不是要我們自己調用recycle,還的看情況而定。如果只是使用少量的幾張圖片,回收與否關係不大。可是若有大量bitmap需要垃圾回收處理,那必然垃圾回收需要做的次數就更多也發生地更頻繁,會對系統資源造成負荷。所以,這個時候還是自己試用recycle來釋放的比較好。
如何去使用recycle()方法和何時試用recycle()都是值得考慮的問題。否側,極易出現下面的異常:
- 05-15 08:31:00.117: E/AndroidRuntime(513): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@44c093b8
只有當你確認你不會在使用這個bitmap的時候,就可以選擇調用recycle()方法釋放它。
今天在做個小測試的時候,就因爲recycle()的調用出現了異常。原因是:
在xml文件中,ImageView有兩個方法來設置一張顯示的圖片:
- android:background="@drawable/aa"
- android:src="@drawable/aa"
剛開始,我使用background,然後在程序中,這樣設置
- // 獲得ImageView當前顯示的圖片
- Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();
- Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(),
- bitmap1.getHeight(), matrix, true);
- // 如果圖片還沒有回收,強制回收
- if (!bitmap1.isRecycled()) {
- bitmap1.recycle();
- }
- // 根據原始位圖和Matrix創建新的圖片
- imageView.setImageBitmap(bitmap2);
因爲imageView.setImageBitmap()方法設置的是對應的src的圖片,而不是background。而我卻把background的圖片給回收了。這樣,就導致了異常的發生。
所以修改成如下的代碼,去調用setBackGround()方法
- // 獲得ImageView當前顯示的圖片
- Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();
- Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(),
- bitmap1.getHeight(), matrix, true);
- // 如果圖片還沒有回收,強制回收
- if (!bitmap1.isRecycled()) {
- bitmap1.recycle();
- }
- // 根據原始位圖和Matrix創建新的圖片
- //imageView.setImageBitmap(bitmap2);
- imageView.setBackgroundDrawable(new BitmapDrawable(bitmap2));
所以,一定要注意ImageView圖片的來源問題,然後在進行相應的recycle。