虽然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. Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(),
  4. bitmap1.getHeight(), matrix, true);
  5. // 如果图片还没有回收,强制回收
  6. if (!bitmap1.isRecycled()) {
  7. bitmap1.recycle();
  8. }
  9. // 根据原始位图和Matrix创建新的图片
  10. 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, 0, 0, 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。


Bitmap的recycle问题的更多相关文章

  1. 一、Bitmap的recycle问题

    尽管Android有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定.假设仅仅是使用少量的几张图片,回收与否关系不大.但是若有大量bitmap须要垃圾回收处理,那必定垃圾回收 ...

  2. 是否需要主动调用Bitmap的recycle方法

    一个Bitmap使用完后,是只需要等它成为垃圾后让GC去回收,还是应该主动调用recycle方法呢?或者说,主动调用recycle方法是否有好处,是否能马上回收内存呢? 带着这个问题来看源码(我看的4 ...

  3. Bitmap recycle()

    Bitmap调用recycle? When? Bitmap有一个recycle方法,意思非常easy,回收Bitmap的空间. Q 1: Bitmap是否有调用recycle方法的必要性? A: 嵌入 ...

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

    1 BitmapFactory.decodeFile(imageFile); 用BitmapFactory解码一张图片时,有时会遇到该错误.这往往是由于图片过大造成的.要想正常使用,则需要分配更少的内 ...

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

    本文来源:转载自: http://mobile.51cto.com/abased-410796.htm 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitma ...

  6. 解析Android开发优化之:对Bitmap的内存优化详解

    在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...

  7. BitMap 内存使用优化

    在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...

  8. Android开发优化之——对Bitmap的内存优化

    http://blog.csdn.net/arui319/article/details/7953690 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitm ...

  9. 如何使用Palette提取Bitmap的颜色

    5.X提出了color palette 的概念,能够让主题动态的去适应当前的页面色调,让整个app色调看起来比较和谐统一 那么如何使用Palette呢,必不可少,我们需要在Android studio ...

随机推荐

  1. WPF 利用HwndSource拦截Windows消息

    WPF提供了一个HwndSource可以使你更快的实现处理Windows消息. 通过HwndSource.FromHwnd得到的HwndSource可以添加(AddHook)移除(Remove)Hoo ...

  2. angular和vue的对比学习之路

    vue-ng 打开vue的中文官网一段关于vue的描述 HTML 模板 + JSON 数据,再创建一个 Vue 实例,就这么简单. 那我么再看下angular中文网 AngularJS是为了克服HTM ...

  3. 华为RH2288 V3服务器进入BIOS并设置iBMC地址

    服务器重启后 第一个画面 提示Ctrl+H或Ctrl+S进入相关配置 其中, Ctrl+H进入WebBIOS初次安装系统可在此做RAID配置 此画面不做操作,等待跳过 进入第二画面 可以选择BootM ...

  4. 未加星标 ajax三级联动的实现方法

    <div id="sanji"></div> 下面考虑的是要有省市区这三列,这三列用的是下拉列表,那么里面要用<option></opti ...

  5. 利用SQL查询扶贫对象医保报销比率的审计方法

    利用SQL查询扶贫对象医保报销比率的审计方法 扶贫资金惠及贫困百姓的切身利益,主管部门多,资金实行逐级下拨,并且扶贫项目小而分散,主要在乡镇和农村实施.根据湖北省审计厅关于2017年扶贫审计工作方案的 ...

  6. Kryo官方文档-中文翻译

    Kryo作为一个优秀的Java序列化方案,在网上能找到不少测评,但未见系统的中文入门或说明文档.官方文档是最好的学习文档.虽然英文不差,但啃下来毕竟没母语来的舒服.这里抽出时间做些翻译,以方便大家查阅 ...

  7. HTML小技巧:按钮中的文字换行 .

    一般按钮的文字都是一行的.但是有的时候画面需要按钮中的文字换行. 刚开始有个开发人员说没法实现.\r\n 都用过了没有效果.其实google这个老师是非常强大的. 直接换行的方法:<input ...

  8. qt获取屏幕

    m_pDesktopWidget = QApplication::desktop(); // 屏体数量,包含扩展屏 int screenCount = m_pDesktopWidget->scr ...

  9. 苹果建议开发者在iOS 7正式发布之前把应用提交至App Store

    今早在给开发者的邮件中,苹果建议开发者在下周9月18日正式发布iOS 7之前把应用提交至App Store.邮件特别提到了iOS 7的新功能,还提到了充分利用iPhone 5S功能的新API,比如M7 ...

  10. Spring_自动组件扫描和 基于注解配置bean

    自动组件扫描 启用Spring组件扫描功能. 使用@Component注释来表示这是类是一个自动扫描组件.  package com.tanlei.dao; import org.springfram ...