ListView 或是 GridView中。Canvas: trying to use a recycled bitmap 异常
来源:互联网 发布:网络热播电视剧排行榜 编辑:程序博客网 时间:2024/05/21 22:42
转自:http://zwnjava.iteye.com/blog/1901880
在做Android的开发的时候,在ListView 或是 GridView中需要加载大量的图片,为了避免加载过多的图片引起OutOfMemory错误,设置了一个图片缓存列表 Map<String, SoftReference<Bitmap>> imageCache , 并对其进行维护,在图片加载到一定数量的时候,就手动回收掉之前加载图片的bitmap,此时就引起了如下错误:
- java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@41de4380
- at android.graphics.Canvas.throwIfRecycled(Canvas.java:1026)
- at android.graphics.Canvas.drawBitmap(Canvas.java:1127)
- at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:393)
- at android.widget.ImageView.onDraw(ImageView.java:961)
- at android.view.View.draw(View.java:13458)
- at android.view.View.draw(View.java:13342)
- at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
- at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
- at android.view.View.draw(View.java:13461)
- at android.view.View.draw(View.java:13342)
图片手动回收部分代码:
- Bitmap removeBitmap = softReference.get();
- if(removeBitmap != null && !removeBitmap.isRecycled()){
- removeBitmap.recycle(); //此句造成的以上异常
- removeBitmap = null;
- }
网上有好多人说应该把recycle()去掉,个人认为去掉后会引起内存持续增长,虽然将bitmap设置为了null,但是系统并没有对其进行真正的回收,仍然占有内存,即是调用了System.gc() 强制回后以后,内存仍然没有下去,如果依靠内存达到上限时系统自己回收的话,个人觉得太晚了,已经对应用造成了影响,应用应该是比较卡了,所以还是赞同加上bitmap.recycle() ,但是又会引起 Canvas: trying to use a recycled bitmap 异常,困扰了很久,开始尝试从其它方面着手来解决这个问题,即然是异常就应该能够捕获到,但是在Adapter里的getView()方法里进行捕获的时候,时机晚了,没有捕获到。现在换到在ImageView的onDraw()里进行捕获,上面的异常能够捕获。
解决方法(继承ImageView 重写onDraw()方法,捕获异常):
在重写onDraw()方法中,其实什么都没有做,只是添加了一个异常捕获,即可捕捉到上面的错误
- import android.content.Context;
- import android.graphics.Canvas;
- import android.util.AttributeSet;
- import android.widget.ImageView;
- /**
- * 重写ImageView,避免引用已回收的bitmap异常
- *
- * @author zwn
- *
- */
- public class MyImageView extends ImageView {
- public MyImageView (Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- try {
- super.onDraw(canvas);
- } catch (Exception e) {
- System.out
- .println("MyImageView -> onDraw() Canvas: trying to use a recycled bitmap");
- }
- }
- }
0 0
- ListView 或是 GridView中。Canvas: trying to use a recycled 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解决
- Canvas: trying to use a recycled bitmap android.graphics.Bitmap
- Canvas: trying to use a recycled bitmap android.graphics.Bitmap
- Picasso使用时,ImageView做ListView的Item出现异常Canvas: trying to use a recycled bitmap
- Picasso使用时,ImageView做ListView的Item时出现异常Canvas: trying to use a recycled bitmap
- Gesture控制图片缩放&Canvas: trying to use a recycled bitmap android.graphics.Bitmap异常
- 关于异常Canvas: trying to use a recycled bitmap android.graphics.Bitmap的解决
- Android回收图片的bitmap,导致的Canvas: trying to use a recycled bitmap异常处理
- java.lang.RuntimeException: Canvas: trying to use a recycled bitmap
- RuntimeException: Canvas: trying to use a recycled 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使用时报错 Canvas: trying to use a recycled bitmap
- 今天遇到Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题
- RedHat Enterprise 7.2(RHEL7)安装Oracle 12.X报compat-libstdc++包的解决办法
- mysql 父类子类查询
- 微软2016校园招聘:#1239 : Fibonacci
- 小记——linux目录
- Android布局中实现圆角边框
- ListView 或是 GridView中。Canvas: trying to use a recycled bitmap 异常
- 【转】 java 运算符优先级
- 《统计学习方法》学习笔记--k近邻法及常用的距离(or 相似度)度量
- 纯代码封装自定义View和XIB封装自定义View的区别
- float类型在内存中的存储
- 关于React Native 网络请求以及变量赋值的问题
- 用SugarORM快速开发需要同步和保存大量数据的Android互联网客户端
- Android自定义类似ProgressDialog效果的Dialog
- Git之(三)Git辅助命令