Bitmap的recycle问题_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Bitmap的recycle问题

Bitmap的recycle问题

 2013/9/2 13:09:34  hafuokas  程序员俱乐部  我要评论(0)
  • 摘要:虽然java有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定。如果只是使用少量的几张图片,回收与否关系不大。可是若有大量bitmap需要垃圾回收处理,那必然垃圾回收需要做的次数就更多也发生地更频繁,会对系统资源造成负荷。所以,这个时候还是自己试用recycle来释放的比较好。如何去使用recycle()方法和何时试用recycle()都是值得考虑的问题。否侧,极易出现下面的异常:05-1508:31:00.117:E/AndroidRuntime(513):java
  • 标签:Map 问题

?? 虽然java有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定。如果只是使用少量的几张图片,回收与否关系不大。可是若有大量bitmap需要垃圾回收处理,那必然垃圾回收需要做的次数就更多也发生地更频繁,会对系统资源造成负荷。所以,这个时候还是自己试用recycle来释放的比较好

??? 如何去使用recycle()方法和何时试用recycle()都是值得考虑的问题。否侧,极易出现下面的异常

class="java">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有两个方法来设置一张显示的图片:

?

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。

?

另外,在显示新图片前,最好,以前的Bitmap recycle掉,否则很容易出现out of memory错误

?

if(b!=null){
			b.recycle();
		}

?

发表评论
用户名: 匿名