【转】Android手动回收bitmap,引发Canvas: trying to use a recycled bitmap处理

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

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected]
    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");
        }
    }

}

原文地址:http://zwnjava.iteye.com/blog/1901880

时间: 2024-10-28 08:19:42

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

Android手动回收bitmapisRecycled(),引发Canvas: trying to use a recycled bitmap处理

通过Imageview显示网络传回来的byte数据,发现内存会不断增大,最终导致内存溢出.于是手动去回收Bitmap的数据,发现会main ex (Canvas: trying to use a recycled bitmap) 网上查询下,发现重新Imageview的onDraw时,在super执行try catch,发现解决了问题,这样不必手动bitmap.recycled(),不然视频会闪动. 查询资料: http://blog.csdn.net/primer_programer/arti

Android手动回收bitmap,引发Canvas: trying to use a recycled bitmap处理

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

关于Canvas: trying to use a recycled bitmap android.graphics的疑惑

============问题描述============ 因为viewpager图片内存溢出的问题,不得不考虑手动释放内存,不过出的问题我不理解. 我的想法是创建一个Map,然后用instantiateItem中的参数arg0当作键,bitmap当作值,当destroyItem中去掉VIew的时候我捎带着把不再用到的bitmap也回收掉 //这个是存bitmap的map public HashMap<Integer, SoftReference<Bitmap>> cacheBit;

Canvas: trying to use a recycled bitmap [email&#160;protected]

近期在做和图片相关显示的出现了一个问题,整理一下思路.分享出来给大家參考一下: Exception Type:java.lang.RuntimeException java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected] at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1282) at android.view.GLE

Android java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email&#160;protected]

近期遇到了如标题这种错误,再次记录解决方法.本文參考帖子: http://bbs.csdn.net/topics/390196217 出现此bug的原因是在内存回收上.里面用Bitamp的代码为: top=(ImageView)view.findViewById(R.id.top); bitmap=ImgBitmap.comeFromRes(getResources(), R.drawable. top); top.setImageBitmap(bitmap); bottom=(ImageVie

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email&#160;protected]

最近遇到了如标题这样的错误,再次记录解决方法.本文参考帖子: http://bbs.csdn.net/topics/390196217 出现此bug的原因是在内存回收上,里面用Bitamp的代码为: top=(ImageView)view.findViewById(R.id.top); bitmap=ImgBitmap.comeFromRes(getResources(), R.drawable. top); top.setImageBitmap(bitmap); bottom=(ImageVi

Android Bitmap和Canvas学习笔记

位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的. 1. 从资源中获取位图 可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图. 当然,首先需要获取资源: Resources res=getResources(); 使用BitmapDrawable获取位图 使用BitmapDrawable (InputStream is)构造一个BitmapDrawable: 使用BitmapDrawable类的getBitmap()获取得到位图: // 读

[转载]Android Bitmap和Canvas学习笔记

http://blog.chinaunix.net/uid-20771867-id-3053339.html [转载]Android Bitmap和Canvas学习笔记,布布扣,bubuko.com

android如果给imageview做圆角,如果在原有的bitmap上加上一些修饰的drawable

先上效果图: Layout文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"