android开源库----Picasso加载图片的内存优化

上次我们说了picasso这个加载图片的开源库,但是我们还是可以对它加载图片进行进一步的优化
1 图片裁剪
我们尽量的剪裁,如图片的列表我们最好都是剪裁过

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

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);   
    }
}

4 RGB_565
对于不透明的图片可以使用RGB_565来优化内存(注意看清楚了是对于不透明的图片)

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

默认情况下使用的ARGB_8888

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

RGB_565呈现结果与ARGB_8888接近,而且从上面可以看出来RGB_565比起使用ARGB_8888剩下了近一半的内存,所以使用不透明的图片的时候建议用RGB_565格式

下面说的这个我不太懂了,不过先收集起来日后研究

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

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

只要在AndroidManifest.xml中定义Activity时加入process属性,即可在新进程中打开此Activity。由此,picasso也将在新进程中创建基于新ApplicationContext的单例。
(这两天一定要研究process,郁闷没用过)

6 列表页滑动优化
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);
        }
    }
});

这里主要是这两个方法,而且方法说明上写的很清楚
Resume paused requests with the given tag
Pause paused requests with the given tag.

 Picasso.with(context).resumeTag(tag);恢复暂停带有特定标记的请求
 Picasso.with(context).pauseTag(tag);暂停带有特定标记的请求

首先说下

newState == RecyclerView.SCROLL_STATE_IDLE

这种情况是滚动状态限制的情况
然后我们就可以判断了,当滑动的时候当处于非滚动状态闲置的情况下我们就可以 暂停请求,然后在滚动处于滚动状态闲置的情况下在恢复请求,就可以防止滑动的时候大量的加载了0.0。

就先介绍这么多了,剩下的我再研究下

你可能感兴趣的:(android开源库)