在android应用开发过程中,经常使用LruCache<String, Bitmap> 对图片进行缓存,LruCache在清除bitmap时,并没有将bitmap recycle。手动 recycle可能会报trying to use a recycled bitmap错误。
解决思路:在bitmap recycle时,判断bitmap是否在使用。
mMemoryCache = new LruCache<String, Bitmap>(size) {
@Override
protected int sizeOf(String key, Bitmap bitmap){
return bitmap.getByteCount();
}
@Override
protected void entryRemoved(boolean evicted, String key,
Bitmap oldValue, Bitmap newValue) {
// TODO Auto-generated method stub
if(mContext instanceof Activity){
Activity activity =(Activity) mContext;
//通过bitmap查找与其关联的view,找不到则认为没有view在使用该bitmap
View view =activity.getWindow().getDecorView().findViewWithTag(oldValue);
if(view ==null && !oldValue.isRecycled()){
oldValue.recycle();
}
}
super.entryRemoved(evicted, key, oldValue, newValue);
}
};
private void refreshView(View view ,Bitmap bitmap){
if(view instanceof ImageView){
((ImageView) view).setImageBitmap(bitmap);
}else{
view.setBackgroundDrawable(new BitmapDrawable(bitmap));
}
//将bitmap与view关联,以实现判断bitmap是否在使用
view.setTag(bitmap);
}
private void refreshView(View view ,int res){
if(view instanceof ImageView){
((ImageView) view).setImageResource(res);
}else{
view.setBackgroundResource(res);
}
view.setTag(null);
}