Android系统中Bitmap是否有调用recycle方法的必要性

泡在网上的日子 / 文 发表于2014-10-21 18:04 次阅读 bitmap

   Bitmap有一个recycle方法,意思很简单,回收Bitmap的空间。但是我们知道java有自己的垃圾回收机制,所以为什么BitaMap还需要这样一个专门的回收方法呢?

无需调用bitmap的理由有:

a. 垃圾回收会处理的;

b. 当application关闭,process被杀掉,所有这个process占用的空间自然回归系统;

   虽然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

  java运行时异常:试图使用一个已经回收了的图片


 只有当你确认你不会在使用这个bitmap的时候,就可以选择调用recycle()方法释放它。


 其实上面说的都是废话,我觉得该不该使用recycle方法,完全取决于你自己的水平,经测,我本人不适合,因为我在自己认为bitmap已经完全不会再使用的地方调用了recycle方法结果在某些条件下还是出现了上面的异常。所以recycle方法虽好,但是你要能够驾驭,而且一般情况下是不需要他的。

注:如评论中那位仁兄所说的,以下情况如果不recycle会发生错误:

当你根据id从drawable(drawable资源文件夹)中获取一个drawable时,系统会将这个drawable加入缓存之中。这样,你第二次继续获取这个drawable时,如果缓存之中的drawable没有被回收,则会被返回。
如果你通过getDrawable(id)方法获取到一个bitmap1,继续通过getDrawable(id)方法获取到一个bitmap2。那么bitmap1=bitmap2。所以,当你对bitmap1进行recycle之后,又将bitmap2设置给Imageview显示,极大可能会出现java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@xxx的错误。


收藏 赞 (8) 踩 (0)
上一篇:Android 4.4从图库选择图片,获取图片路径并裁剪
最近在做一个从图库选择图片或拍照,然后裁剪的功能.本来是没问题的,一直在用 Intent intent=new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 的方式来做,是调用系统图库来做,但是发现如果有图片是同步到go
下一篇:android AsyncTask介绍
在网上看到一篇讲解AsyncTask的文章比较适合初学者,但是有各地方需要指正:文中总是拿它和Handler比较,这是不恰当的,因为AsyncTask其实还是用Handler实现的。下面是原文: AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是a