Picasso使用时,ImageView做ListView的Item时出现异常Canvas: trying to use a recycled bitmap

来源:互联网 发布:剑三成男恐怖脸型数据 编辑:程序博客网 时间:2024/05/29 15:38

经过是这样的: 我在activityA显示了一个listview使用imageView作为item,图片是从网络获取,我这里直接用的是网络框架Picasso,它内部自带缓存机制,而点击listView的Item会跳到activityB,并使用被点击的图片的url.重新获取图片显示到activityB上面:在activityA上面我的调用时这样的:

Picasso.with(context).load(mUrl).into(imageViewA);

而在activityB中我尝试使用Target(注意!问题就在这里!),监听图片加载接口来实现设置imageView:

Picasso.with(mContext).load(mUrl).into(new Target() {    //图片加载成功    @Override    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {        imageViewB.setImageBitmap(bitmap);    }    );

当我运行的时候,点击某个条目跳转到activityB,当我返回到activityA,并上下滑动,当显示到刚才被点击的那个条目时就出现了异常:

Canvas: trying to use a recycled bitmap android.graphics.Bitmap

当时那可真是一脸懵逼啊,于是各种搜索,各种查找,最终让我找到了原因:

在activityA中我使用url给item设置图片时,bitmap对象会存到Picasso的缓存机制中,在activityB中我使用相同的url加载图片时,在target的回调onBitmapLoaded方法中拿到的bitmap就是activityA中Picasso缓存过的bitmap,当我finish()了activityB,这时对应的bitmap就被回收掉了. 重新回到activityA时,Picasso并不知道这个缓存的bitmap被回收了,还是直接设置给了ListView的item,此时就会报这个异常.
所以在activityB中我也就不用target 了,继续使用Picasso.with(context).load(mUrl).into(imageViewB);问题就得到了解决;
参考文章:
1.http://stackoverflow.com/questions/28151017/runtimeexception-canvas-trying-to-use-a-recycled-bitmap-android-graphics-bitma
2.http://bbs.csdn.net/topics/390826811

1 0