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问题会再次更新。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值