在做Android的开发的时候,在ListView 或是 GridView中需要加载大量的图片,为了避免加载过多的图片引起OutOfMemory错误,设置了一个图片缓存列表 Map<String, SoftReference<Bitmap>> imageCache , 并对其进行维护,在图片加载到一定数量的时候,就手动回收掉之前加载图片的bitmap,此时就引起了如下错误:

  1. java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@41de4380
  2. at android.graphics.Canvas.throwIfRecycled(Canvas.java:1026)
  3. at android.graphics.Canvas.drawBitmap(Canvas.java:1127)
  4. at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:393)
  5. at android.widget.ImageView.onDraw(ImageView.java:961)
  6. at android.view.View.draw(View.java:13458)
  7. at android.view.View.draw(View.java:13342)
  8. at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
  9. at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
  10. at android.view.View.draw(View.java:13461)
  11. at android.view.View.draw(View.java:13342)

图片手动回收部分代码:

  1. Bitmap removeBitmap = softReference.get();
  2. if(removeBitmap != null && !removeBitmap.isRecycled()){
  3. removeBitmap.recycle(); //此句造成的以上异常
  4. removeBitmap = null;
  5. }

网上有好多人说应该把recycle()去掉,个人认为去掉后会引起内存持续增长,虽然将bitmap设置为了null,但是系统并没有对其进行真正的回收,仍然占有内存,即是调用了System.gc() 强制回后以后,内存仍然没有下去,如果依靠内存达到上限时系统自己回收的话,个人觉得太晚了,已经对应用造成了影响,应用应该是比较卡了,所以还是赞同加上bitmap.recycle() ,但是又会引起  Canvas: trying to use a recycled bitmap 异常,困扰了很久,开始尝试从其它方面着手来解决这个问题,即然是异常就应该能够捕获到,但是在Adapter里的getView()方法里进行捕获的时候,时机晚了,没有捕获到。现在换到在ImageView的onDraw()里进行捕获,上面的异常能够捕获。

解决方法(继承ImageView 重写onDraw()方法,捕获异常):

在重写onDraw()方法中,其实什么都没有做,只是添加了一个异常捕获,即可捕捉到上面的错误

  1. import android.content.Context;
  2. import android.graphics.Canvas;
  3. import android.util.AttributeSet;
  4. import android.widget.ImageView;
  5. /**
  6. * 重写ImageView,避免引用已回收的bitmap异常
  7. *
  8. * @author zwn
  9. *
  10. */
  11. public class MyImageView extends ImageView {
  12. public MyImageView (Context context, AttributeSet attrs) {
  13. super(context, attrs);
  14. }
  15. @Override
  16. protected void onDraw(Canvas canvas) {
  17. try {
  18. super.onDraw(canvas);
  19. } catch (Exception e) {
  20. System.out
  21. .println("MyImageView  -> onDraw() Canvas: trying to use a recycled bitmap");
  22. }
  23. }
  24. }

Android手动回收bitmap,引发Canvas: trying to use a recycled bitmap处理的更多相关文章

  1. Android开发回收bitmap引发Canvas: trying to use a recycled bitmap错误处理

    当你的应用由于加载大量图片出现OOM异常时,肯定会上网搜索关于OOM的文章,并导求相应的解决方案,比如压缩图片大小,或手动回收资源什么的.在这里我们不讨论图片压缩或缓冲这些方法,而是讨论一下手动回收B ...

  2. Android Bitmap操作问题之Canvas: trying to use a recycled bitmap

    一.Bitmap.recycle 方法被弃用 在Android中,Bitmap的存储分为两部分,一部分是Bitmap的数据,一部分是Bitmap的引用.在Android2.3时代,Bitmap的引用是 ...

  3. Canvas: trying to use a recycled bitmap android.graphics.Bitmap@XXX

    近期在做和图片相关显示的出现了一个问题,整理一下思路.分享出来给大家參考一下: Exception Type:java.lang.RuntimeException java.lang.RuntimeE ...

  4. java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@412d7230

    近期遇到了如标题这种错误,再次记录解决方法.本文參考帖子: http://bbs.csdn.net/topics/390196217 出现此bug的原因是在内存回收上.里面用Bitamp的代码为: t ...

  5. Android java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@412d7230

    近期遇到了如标题这种错误,再次记录解决方法.本文參考帖子: http://bbs.csdn.net/topics/390196217 出现此bug的原因是在内存回收上.里面用Bitamp的代码为: t ...

  6. Android Bitmap和Canvas学习笔记 [转]

    原文:http://www.cnblogs.com/feisky/archive/2010/01/10/1643460.html 位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的. ...

  7. Android Bitmap和Canvas学习笔记

    位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的. 1. 从资源中获取位图 可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图. 当然,首先需要获 ...

  8. 关于bitmap recycle trying to use a recycled bitmap android.graphics.Bitmap

    在开发中,一直使用4.0以上手机作为測试机所以一直没有出现这个问题,今天换了2.3版本号的手机.出现了这个错误: trying to use a recycled bitmap android.gra ...

  9. 赵雅智_运用Bitmap和Canvas实现图片显示,缩小,旋转,水印

    上一篇已经介绍了Android种Bitmap和Canvas的使用,以下我们来写一个详细实例 http://blog.csdn.net/zhaoyazhi2129/article/details/321 ...

随机推荐

  1. path变量修改后无法保存

    Eclipse启动时出现错误: A Java Runtime Environment (JRE) or Java Development Kit(JDK) must be available in o ...

  2. MT【157】至少一个小于1

    若函数$f(x)=x^2+ax+b$有两个不等实数根$x_1,x_2$,且$1<x_1<x_2<3$,那么$f(1),f(3)中$    (      )A.只有一个小于1 B.至少 ...

  3. 第七周linux学习

    <Linux内核分析> 一.可执行程序是怎么得来的? 编译器预处理(负责把include的文件包含进来及宏替换等工作):编译成汇编代码:编译器编译成目标代码:再链接成可执行文件:操作系统加 ...

  4. vim 折叠的用法

    http://www.cnblogs.com/fakis/archive/2011/04/14/2016213.html 1. 折叠方式 可用选项来设定折叠方式: 可在Vim 配置文件中设置 set ...

  5. Android Studio之BuildConfig类

    https://blog.csdn.net/lvxiangan/article/details/71601451 Android Studio开发中,把一个module输出打包为jar文件,我们会发现 ...

  6. View的setLayerType() , setDrawingCacheEnabled() 方法用法

    一.Android开发:用getDrawingCache方法获取ImageView中的图像需要注意的问题http://www.linuxidc.com/Linux/2011-09/43131.htm ...

  7. HDU--4705

    题目: Y 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 分析:树形dp的思想,枚举中间点. #include<iostream> ...

  8. git<Commit和Push的区别>

    git作为支持分布式版本管理的工具,它管理的库(repository)分为本地库.远程库. git commit操作的是本地库,git push操作的是远程库. git commit是将本地修改过的文 ...

  9. 初学SQL语句练习1

    --[1 ]查询出每个月倒数第三天受雇的所有员工SELECT * FROM EMP WHERE HIREDATE=LAST_DAY(HIREDATE)-2; --[2 ]找出早于30 年前受雇的员工S ...

  10. jQuery速看

    本文参考w3school网站. jQuery是一个十分流行的javascript库. 基础语法是:$(selector).action() $:表示使用的语法为jquery selector:选择器 ...