经过是这样的: 我在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