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

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

[java] view plaincopy
  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 plaincopy
  1. android:background="@drawable/aa"
  2. android:src="@drawable/aa"

刚开始,我使用background,然后在程序中,这样设置

[java] view plaincopy
  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 plaincopy
  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. Android App ~ Bitmap 调用 recycle() 回收内存

    Bitmap调用recycle? When? Bitmap有一个recycle方法,意思很简单,回收Bitmap的空间. Q 1: Bitmap是否有调用recycle方法的必要性? A: 嵌入式系统 ...

  2. BitMap的recycle问题

    虽然Android有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定.如果只是使用少量的几张图片,回收与否关系不大.可是若有大量bitmap需要垃圾回收处理,那必然垃圾回收需 ...

  3. Bitmap recycle()

    Bitmap调用recycle? When? Bitmap有一个recycle方法.含义很easy,恢复Bitmap空间. Q 1: Bitmap有调用recycle方法的必要性? A: 嵌入式系统总 ...

  4. BitMap 内存使用优化

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

  5. 非常全面的Android Bitmap知识点梳理

    在日常开发中,可以说和Bitmap低头不见抬头见,基本上每个应用都会直接或间接的用到,而这里面又涉及到大量的相关知识. 所以这里把Bitmap的常用知识做个梳理,限于经验和能力,不做太深入的分析. 1 ...

  6. Android Bitmap面面观

    在日常开发中,可以说和Bitmap低头不见抬头见,基本上每个应用都会直接或间接的用到,而这里面又涉及到大量的相关知识. 所以这里把Bitmap的常用知识做个梳理,限于经验和能力,不做太深入的分析. 1 ...

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

    我们知道Android系统分配给每个应用程序的内存是有限的,Bitmap作为消耗内存大户,我们对Bitmap的管理稍有不当就可能引发OutOfMemoryError,而Bitmap对象在不同的Andr ...

  8. Android之Bitmap的内存优化方案总结

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

  9. Android对Bitmap的内存优化

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

最新文章

  1. 点云及三维图像处理综述
  2. 网络计算机统考报名网,2017年《计算机应用基础》统考试题及答案
  3. 台湾国立大学郭彦甫Matlab教程笔记(12) advanced 2D plot 下
  4. 二分法c语言代码(递归、迭代)
  5. Ubuntu 18.04 - 启动时停留在 start bpfilter
  6. React的Element的创建和render
  7. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-2.中大型公司里面项目开发流程讲解...
  8. 教你如何用python获得中国气象数据网的API数据并且导入数据库(附源码)
  9. 经典的java角色扮演,盘点2010年十大经典角色扮演类游戏合集
  10. IDEA初学者 常用注解意思
  11. 如何在工作中设定和使用 SMART 目标
  12. vue项目如何真机测试
  13. M1 MacBook的Parellel Desktop(PD)使用问题记录
  14. Android 自定义view 实现点击 展示下拉选项效果
  15. C语言华氏温度转换为摄氏温度
  16. 数字化的野蛮生长需要驯服
  17. 线上flink任务重启报错(Hadoop问题)java.lang.NumberFormatException: For input string: “30s“
  18. 座右铭-激励自己的话
  19. JS相关笔记---DAY2(逻辑运算,判断,循环以及demo,在输出方面和C,java有很大不同!)
  20. 整型数组处理算法(十一)请实现一个函数:线段重叠。[风林火山]

热门文章

  1. Python爬虫xpath详解
  2. linux sed命令:查看gitlab配置文件删除注释行并过滤空行后的内容
  3. linux shell参数传递、获取方式
  4. reactjs使用eject暴露webpack核心配置
  5. k8s查看节点CPU消耗情况
  6. docker容器间数据共享
  7. Spring MVC入门示例教程--静态页面跳转
  8. springboot2.3.x版本对应的spring5与thymeleaf版本配置
  9. python实现不重复排列组合_Python实现输入字符串,返回其任意排列组合
  10. 在git项目误上传了本地idea配置文件,如何解决?