Picasso OOM浅谈。

自从项目图片加载从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问题会再次更新。

你可能感兴趣的:(Android)