美文网首页Android干货Android开发Android
使用Picasso加载图片的内存优化实践

使用Picasso加载图片的内存优化实践

作者: 我是Asha | 来源:发表于2015-08-26 16:41 被阅读14428次

0 说明

现在Android开源库中有许多图片加载框架,本文以picasso为例,总结下开发过程中的一些优化经验,使用的picasso版本如下

compile 'com.squareup.picasso:picasso:2.5.2'

1 图片裁剪

在列表页尽量使用裁剪后的图片,在查看大图模式下才加载完整的图片。

图片裁剪示例

Picasso.with( imageView.getContext() )
.load(url)
.resize(dp2px(250),dp2px(250))
.centerCrop()
.into(imageView);

picasso默认情况下会使用全局的ApplicationContext,即开发者传进去Activity,picasso也会通过activity获取ApplicationContext。

2 查看大图放弃memory cache

Picasso默认会使用设备的15%的内存作为内存图片缓存,且现有的api无法清空内存缓存。我们可以在查看大图时放弃使用内存缓存,图片从网络下载完成后会缓存到磁盘中,加载会从磁盘中加载,这样可以加速内存的回收。

Picasso.with(getApplication())
.load(mURL)
.memoryPolicy(NO_CACHE, NO_STORE)
.into(imageView);

其中memoryPolicy的NO_CACHE是指图片加载时放弃在内存缓存中查找,NO_STORE是指图片加载完不缓存在内存中。

3 RecyclableImageView

重写ImageView的onDetachedFromWindow方法,在它从屏幕中消失时回调,去掉drawable引用,能加快内存的回收。

public class RecyclerImageView extends ImageView
{ 
    ...

    @Override    
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        setImageDrawable(null);   
    }
}

实验环境:加载大图不使用内存缓存。
实验场景:从图片列表页切换到详情页看大图,然后返回,不停重复。

普通ImageView RecyclableImageView

可以看到使用了RecyclableImageView的实验在切换过程中产生的内存谷值明显优于ImageView,说明drawable更容易被回收。

4 新进程中查看大图

列表页的内存已经非常稳定,但是查看大图时,大图往往占用了20+m内存,加上现有进程中的内存,非常容易oom,在新进程中打开Activity成为比较取巧的避免oom的方式。

<activity android:name=".DetailActivity" android:process=":picture"/>

只要在AndroidManifest.xml中定义Activity时加入process属性,即可在新进程中打开此Activity。由此,picasso也将在新进程中创建基于新ApplicationContext的单例。

5 列表页滑动优化

picasso可以对多个加载请求设置相同的tag,即

Object tag = new Object();
Picasso.with( imageView.getContext() )
.load(url)
.resize(dp2px(250),dp2px(250))
.centerCrop()
.tag(tag)
.into(imageView);

例如在RecyclerView滑动时监听,处理不同的表现:

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState)
    {
        if (newState == RecyclerView.SCROLL_STATE_IDLE)
        {
            Picasso.with(context).resumeTag(tag);
        }
        else
        {
            Picasso.with(context).pauseTag(tag);
        }
    }
});

6 RGB_565

对于不透明的图片可以使用RGB_565来优化内存。

Picasso.with( imageView.getContext() )
.load(url)
.config(Bitmap.Config.RGB_565)
.into(imageView);

默认情况下,Android使用ARGB_8888

Android中有四种,分别是:
ALPHA_8:每个像素占用1byte内存
ARGB_4444:每个像素占用2byte内存
ARGB_8888:每个像素占用4byte内存
RGB_565:每个像素占用2byte内存

RGB_565呈现结果与ARGB_8888接近,内存对比如下图

默认ARGB_8888,列表滑动时平均内存10m RGB_565,列表滑动时,平均7M

7 reference

Picasso and Context
JakeWharton的避免OOM建议
Clear Cache memory of Picasso

相关文章

  • 开源项目实战记录----Picasso

    使用Picasso加载图片的内存优化实践 http://www.jianshu.com/p/6b746c904a49

  • 使用Picasso加载图片的内存优化实践

    0 说明 现在Android开源库中有许多图片加载框架,本文以picasso为例,总结下开发过程中的一些优化经验,...

  • Picasso的使用

    Picasso的基本使用 picasso仅需一行代码就能实现图片的异步加载 Picasso不仅实现了图片异步加载的...

  • Picasso源码解析

    Picasso 是一个强大的图片加载缓存框架 一、使用 二、重要的类 Picasso: 图片加载、转换、缓存的管理...

  • Picasso的源码流程

    picasso的使用1)加载一张图片Picasso.with(this).load("url").placehol...

  • Picasso加载圆角图片

    使用Picasso加载自定义圆角的圆形图片

  • 图片内存优化(picasso)

    创建自定义RecyclerImageView,替换原imageView,重写onDetachedFromWindo...

  • picasso框架

    picasso 是一个强大的图片加载缓存框架 1.首先看下picasso 如何使用: Picasso和Glide相...

  • 图片加载库-Picasso使用

    引入 Picasso 库 混淆 使用 加载网络图片当然首先要设置权限 Picasso 允许在应用程序中轻松加载图像...

  • Glide 新版中GlideApp(AppGlideModul

    Glide在4.0之后,我们使用的时候需要使用GlideApp这种调用方式,或者优化图片加载内存是会出现设置图片的...

网友评论

  • 凉羽:你好,我想问下我现在用picasso加载图片的图片列表里面,小图片中混杂着大图片 ,都在一个列表里面展示,会有OOM的异常,这个要怎么办呢

本文标题:使用Picasso加载图片的内存优化实践

本文链接:https://www.haomeiwen.com/subject/tpshcttx.html