在做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()方法里进行捕获的时候,时机晚了,没有捕获到。现在换到在ImageViewonDraw()里进行捕获,上面的异常能够捕获。

解决方法(继承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);}@Overrideprotected void onDraw(Canvas canvas) {try {super.onDraw(canvas);} catch (Exception e) {System.out.println("MyImageView  -> onDraw() Canvas: trying to use a recycled bitmap");}}}

更多相关文章

  1. Eclipse项目导入Android(安卓)Studio,.9图片报错解决办法
  2. Android(安卓)设置ImageView中图片的显示方式
  3. android dp dpi
  4. Android(安卓)ScrollView 中放入 ImageView 的出现上下空白
  5. Android(安卓)ListView从网络获取图片及文字显示
  6. 【转】Android自适应不同分辨率或不同屏幕大小的layout布局(横屏
  7. Android(安卓)ListView分页加载数据
  8. 网络编程
  9. ImageView的android:scaleType属性和 src、Background之前的区别

随机推荐

  1. 2021年最新的PHP面试题(附答案)
  2. PHP实现统计在线人数的方法
  3. php垃圾回收机制实例介绍
  4. 总结PHP编程20大效率要点
  5. PHP代码加密的几种方法介绍
  6. PHP 加密:Password Hashing API
  7. PHP查找一列有序数组是否包含某值(二分查
  8. 关于php命令行模式介绍
  9. php实现根据身份证获取年龄
  10. PHP基于ElasticSearch做搜索