自从项目图片加载从ImageLoader换成了Picasso,很久没有担心过OOM的问题了。不过最近在三星Note2发现加载大图的时候出现了OOM,通过解决了这个问题,把Picasso的理解又加深了一层。于是今天简单记录一下造成OOM的原因和解决方法。
场景1、
在ListView里面,piscasso加载图片,不用担心复用问题,可是假如ImageView是100*100,而图片是1000*1000,他是把1000*1000的图片加载到100*100里面,如果图片多了,就会很容易造成oom,所以在picasso在加载图片的时候,如果imageview规定了宽高,一定要记得使用resize。
Picasso.with(context.getApplicationContext()).load(url)
.resize(width, height)
.into(imageView);
或
Picasso.with(context.getApplicationContext()).load(url)
//从dimen里面取
.resizeDimen(targetWidthResId, targetHeightResId)
.into(imageView);
场景2、列表点击缩略图弹dialog显示大图
一般单张大图是不容易造成OOM的,如果会也要resize。在这是ListView列表中的缩略图,点击之后创建一个dialog,然后dialog里面有个大Imageview来显示列表中的ImageView,但是点击多个缩略图,就生成了多个dialog,而显示的ImageView没有回收资源,所以也会造成OOM。所以在再次点击dialog,让它消失的时候回收资源(一个dialog,显示不同的图片,没有回收资源也会OOM)
解决方法:
/**
* 清空图片的内存
*/
public static void clearImgMemory(View V)
{
if(V instanceof ImageView)
{
Drawable d=((ImageView)V).getDrawable();
if(d!=null&&d instanceof BitmapDrawable)
{
Bitmap bmp=((BitmapDrawable)d).getBitmap();
bmp.recycle();
bmp=null;
}
((ImageView)V).setImageBitmap(null);
if(d!=null){
d.setCallback(null);
}
}
}
//imageview是dialog中的大图ImageView,再次点击隐藏对话框
imageview.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
BitmapUtil.clearImgMemory(imageview);
System.gc();
}
});
暂时内容记录到这里,如果遇见其他的OOM问题会再次更新。