在做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"); } } }
相关推荐
主要介绍了 Android canvas drawBitmap方法详解及实例的相关资料,需要的朋友可以参考下
Android—BitMap与Canvas学习笔记
android 画图 bitmap drawable canvas paint
android里面 canvas 转换成bitmap
android中对Bitmap图片设置任意角为圆角
Android开发者学习笔记——View、Canvas、bitmap
在Android UI开发专题的前五节我们讲到的东西主要是基础和理论内容,从本次Android123将通过实例代码来演示,本次主要是Bitmap和Canvas类的使用,根据要求缩放Bitmap对象并返回新的Bitmap对象。centerToFit方法一共...
Android UI开发(五)Bitmap和Canvas实例.docxAndroid UI开发(五)Bitmap和Canvas实例.docxAndroid UI开发(五)Bitmap和Canvas实例.docxAndroid UI开发(五)Bitmap和Canvas实例.docxAndroid UI开发(五)Bitmap和Canvas实例...
Maven坐标:org.roaringbitmap:RoaringBitmap:0.7.45; 标签:roaringbitmap、RoaringBitmap、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 ...
Android下使用Canvas生成验证码Bitmap
android bitmap outofMemory 用来解决android中常见的bitmap outOfMemory
支持2.3以上,读取fb0的数据,需要root权限,不同机型色值不同有时会显示失真,色差自己根据机型调整
1. 获取Bitmap: 1)在图片下载缓存好之后获取 Glide.with(mContext).load(url).asBitmap().into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? ...
处理bitmap内存溢出问题
很多网友刚刚开始学习Android平台,对于Drawable、Bitmap、Canvas和Paint它们之间的概念不是很清楚,其实它们除了Drawable外早在Sun的J2ME中就已经出现了,但是在Android平台中,Bitmap、Canvas相关的都有所变化。...
主要介绍了Android 实现把bitmap图片的某一部分的颜色改成其他颜色,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
将pdf文件转换成图片并显示在界面, 先要引用AndroidPDFViewerLibrary-master ... Bitmap image = page.getImage((int)(page.getWidth() * scale), (int)(page.getHeight() * scale), null, true, true);
Android不支持将Bitmap转换成单色的Bmp图片,所以参考Bmp格式说明,自己写了一个转换类。亲测有效!!!
Android-使用Matrix对Bitmap进行处理
代码是关于bitmap图形特效处理的。有黑白特效、底片特效、浮雕特效、模糊特效、锐化特效、怀旧特效。