一、Bitmap的recycle问题

尽管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 [email protected]

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问题

时间: 2024-08-01 22:02:33

一、Bitmap的recycle问题的相关文章

Bitmap recycle()

Bitmap调用recycle? When? Bitmap有一个recycle方法,意思非常easy,回收Bitmap的空间. Q 1: Bitmap是否有调用recycle方法的必要性? A: 嵌入式系统总是格外注重空间的问题,不小心的话就会有OOM.可是应用层使用java的android平台有其天然的优势[java语言有自己的垃圾回收,android平台上各个application有自己的process自己的空间]. 无需调用bitmap的理由有: a. 垃圾回收会处理的: b. 当appl

【转】Android开发之Bitmap的内存优化详解

本文来源:转载自: http://mobile.51cto.com/abased-410796.htm 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图片的内存优化,是Android应用开发中比较重要的内容. 1.要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收.这里就有疑问了,Android系

Android Bitmap面面观

转自android程序员:http://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=404530070&idx=1&sn=e2580b69d6ec73dabf8160216aa6702a&scene=23&srcid=#rd 开通赞赏后的第一篇文章,仍然由大家熟悉的冯建同学投稿,他的这几篇文章可以说风格类似,都是某一个专题的详细整理,这次轮到Bitmap了.点击这里可以快速访问他的上一篇投稿: 你应该知道的那些Andr

优化—对Bitmap的内存优化

在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图片的内存优化,是Android应用开发中比较重要的内容. 1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收.这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间.那为什么还需

java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法

1 BitmapFactory.decodeFile(imageFile); 用BitmapFactory解码一张图片时,有时会遇到该错误.这往往是由于图片过大造成的.要想正常使用,则需要分配更少的内存空间来存储. BitmapFactory.Options.inSampleSize 设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误.inSampleSize的具体含义请参考SDK文档.例如: 1 2 3 BitmapFactory.Options op

Android 那些你所不知道的Bitmap对象具体解释

我们知道Android系统分配给每一个应用程序的内存是有限的,Bitmap作为消耗内存大户.我们对Bitmap的管理稍有不当就可能引发OutOfMemoryError,而Bitmap对象在不同的Android版本号中存在一些差异,今天就给大家介绍下这些差异.并提供一些在使用Bitmap的须要注意的地方. 在Android2.3.3(API 10)及之前的版本号中,Bitmap对象与其像素数据是分开存储的,Bitmap对象存储在Dalvik heap中,而Bitmap对象的像素数据则存储在Nati

BitMap 内存使用优化

在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图片的内存优化,是Android应用开发中比较重要的内容. 1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收.这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间.那为什么还需

Android 那些你所不知道的Bitmap对象详解

我们知道Android系统分配给每个应用程序的内存是有限的,Bitmap作为消耗内存大户,我们对Bitmap的管理稍有不当就可能引发OutOfMemoryError,而Bitmap对象在不同的Android版本中存在一些差异,今天就给大家介绍下这些差异,并提供一些在使用Bitmap的需要注意的地方. 在Android2.3.3(API 10)及之前的版本中,Bitmap对象与其像素数据是分开存储的,Bitmap对象存储在Dalvik heap中,而Bitmap对象的像素数据则存储在Native

Android应用开发中对Bitmap的内存优化

在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图片的内存优化,是Android应用开发中比较重要的内容. 1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收.这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间.那为什么还需