您的位置:首页 > 移动开发 > Android开发

Picasso OOM浅谈。

2016-06-03 15:51 381 查看
自从项目图片加载从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问题会再次更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oom android picasso