使用Picasso加载图片的内存优化实践
2016-04-22 00:00
429 查看
摘要: 加载图片的内存优化实践
图片裁剪示例
picasso默认情况下会使用全局的ApplicationContext,即开发者传进去Activity,picasso也会通过activity获取ApplicationContext。
其中memoryPolicy的NO_CACHE是指图片加载时放弃在内存缓存中查找,NO_STORE是指图片加载完不缓存在内存中。
实验环境:加载大图不使用内存缓存。
实验场景:从图片列表页切换到详情页看大图,然后返回,不停重复。
普通ImageView
RecyclableImageView
可以看到使用了RecyclableImageView的实验在切换过程中产生的内存谷值明显优于ImageView,说明drawable更容易被回收。
只要在AndroidManifest.xml中定义Activity时加入process属性,即可在新进程中打开此Activity。由此,picasso也将在新进程中创建基于新ApplicationContext的单例。
例如在RecyclerView滑动时监听,处理不同的表现:
默认情况下,Android使用ARGB_8888
RGB_565呈现结果与ARGB_8888接近,内存对比如下图
默认ARGB_8888,列表滑动时平均内存10m
RGB_565,列表滑动时,平均7M
JakeWharton的避免OOM建议
Clear Cache memory of Picasso
文/我是Asha(简书作者)
原文链接:http://www.jianshu.com/p/6b746c904a49
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”
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 ContextJakeWharton的避免OOM建议
Clear Cache memory of Picasso
文/我是Asha(简书作者)
原文链接:http://www.jianshu.com/p/6b746c904a49
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”
相关文章推荐
- ssh: permission denied (publickey)
- Gradle DSL method not found: 'runProguard()'
- Do not request Window.FEATURE_SUPPORT_ACTION_BAR
- Illegal mix of collations (utf8_unicode_ci,IMPLICI
- 厦门巨游网络科技有限公司(HOTPOWER)承接游戏UI外包
- redis安装
- redis基础
- redis数据类型
- redis key规则详解
- redis 对string的操作命令
- redis 对list操作命令
- redis对set类型的操作
- redis对hash类型的操作
- redis对zset操作总结
- 没技能到处碰壁 蜂窝教育iOS培训改变现状
- 网桥的创建及分配ip
- EntityManager无法remove entity的问题
- 浅析JPA中EntityManager无法remove entity的问题
- 关于WPF的Button 的click事件调用 code UI 代码的示例(有益于快速的自动化)
- opencv 图片融合