RuntimeException: Canvas: trying to use a recycled bitmap
来源:互联网 发布:淘宝改差评的链接 编辑:程序博客网 时间:2024/06/06 00:18
在写瀑布流图片加载的时候出现了一个错误 java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap
从log可以找到错误的源头
@Override protected void onDestroy() { super.onDestroy(); // Bitmap对象回收掉 if (bitmap != null) { bitmap.recycle(); } }
这就意味着只有当你确认你不会在使用这个bitmap的时候,才可以选择调用recycle()方法释放它。
而我这里是使用了第三方的UIL图片加载库,它拥有完整的图片缓存机制,所以可能在未完全回收掉的时候使用了该bitmap
(这里亲测,如果加载了大图,没有立即回退,可能不会出现错误,如果马上回退,立即出错)
按照网上的写法,在自定义的view的onDraw方法中捕获异常:
@Override protected void onDraw(Canvas canvas) { try { super.onDraw(canvas); initBitmap(canvas); } catch (Exception e){ System.out.println("Canvas: trying to use a recycled bitmap"); } }
发现依然出错,说白了自定义的View仍然持有bitmap,可能跟使用ImageLoader有关,不知道自己用BitmapFactory会咋样没试过。
解决的方案:在回收前,确定所有对bitmap的使用都停止了,如设置背景bitmap为空等操作setImageDrawable(null),setbackgroud(null);,具体情况具体分析。只有当你确认你不会在使用这个bitmap的时候,就可以选择调用recycle()方法释放它。
在网上看到的一段话:
我觉得该不该使用recycle方法,完全取决于你自己的水平,经测,我本人不适合,因为我在自己认为bitmap已经完全不会再使用的地方调用了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的错误。
- java.lang.RuntimeException: Canvas: trying to use a recycled bitmap
- RuntimeException: Canvas: trying to use a recycled bitmap
- java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@41a7f048
- java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@412d7230
- java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap...
- java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@412d723
- java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@358df999
- java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap:报错解决
- 图片显示的内存回收出现RuntimeException: Canvas: trying to use a recycled bitmap
- Canvas: trying to use a recycled bitmap android.graphics.Bitmap
- Canvas: trying to use a recycled bitmap android.graphics.Bitmap
- trying to use a recycled bitmap解决之道
- trying to use a recycled bitmap分析
- 【Bitmap】Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题
- Bitmap的recycle后Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题
- 解决Bitmap recycle异常:Canvas: trying to use a recycled bitmap android.graphics.Bitmap
- Android Bitmap回收异常:Canvas: trying to use a recycled bitmap android.graphics.Bitmap解决
- 有关Bitmap使用时报错 Canvas: trying to use a recycled bitmap
- Android中Context详解
- Thumbnailator图像处理
- 【leetcode】263. Ugly Number
- swift 学习笔记一
- KMP算法
- RuntimeException: Canvas: trying to use a recycled bitmap
- RAID各级别特性
- XML——XML解析之DOM
- hive order by sort by distribute by总结
- 游标-----内存中的一块区域,存放的是select 的结果
- java学习基础篇(二)构造器的定义与作用
- 问题解决: No module named requests, __init__.py:166: UserWarning: No parser was explicitly specified
- Remove Element
- 插入排序实例