使用Picasso加载图片的内存优化实践
来源:互联网 发布:数据库工程师 历年真题 编辑:程序博客网 时间:2024/05/21 15:46
0 说明
现在Android开源库中有许多图片加载框架,本文以picasso为例,总结下开发过程中的一些优化经验,使用的picasso版本如下
- 1
1 图片裁剪
在列表页尽量使用裁剪后的图片,在查看大图模式下才加载完整的图片。
图片裁剪示例
- 1
- 2
- 3
- 4
- 5
picasso默认情况下会使用全局的ApplicationContext,即开发者传进去Activity,picasso也会通过activity获取ApplicationContext。
2 查看大图放弃memory cache
Picasso默认会使用设备的15%的内存作为内存图片缓存,且现有的api无法清空内存缓存。我们可以在查看大图时放弃使用内存缓存,图片从网络下载完成后会缓存到磁盘中,加载会从磁盘中加载,这样可以加速内存的回收。
- 1
- 2
- 3
- 4
其中memoryPolicy的NO_CACHE是指图片加载时放弃在内存缓存中查找,NO_STORE是指图片加载完不缓存在内存中。
3 RecyclableImageView
重写ImageView的onDetachedFromWindow方法,在它从屏幕中消失时回调,去掉drawable引用,能加快内存的回收。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
实验环境:加载大图不使用内存缓存。
实验场景:从图片列表页切换到详情页看大图,然后返回,不停重复。
可以看到使用了RecyclableImageView的实验在切换过程中产生的内存谷值明显优于ImageView,说明drawable更容易被回收。
4 新进程中查看大图
列表页的内存已经非常稳定,但是查看大图时,大图往往占用了20+m内存,加上现有进程中的内存,非常容易oom,在新进程中打开Activity成为比较取巧的避免oom的方式。
- 1
只要在AndroidManifest.xml中定义Activity时加入process属性,即可在新进程中打开此Activity。由此,picasso也将在新进程中创建基于新ApplicationContext的单例。
5 列表页滑动优化
picasso可以对多个加载请求设置相同的tag,即
- 1
- 1
- 2
- 3
- 4
- 5
- 6
例如在RecyclerView滑动时监听,处理不同的表现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
6 RGB_565
对于不透明的图片可以使用RGB_565来优化内存。
- 1
- 2
- 3
- 4
默认情况下,Android使用ARGB_8888
- 1
- 2
- 3
- 4
- 5
RGB_565呈现结果与ARGB_8888接近,内存对比如下图
7 reference
Picasso and Context
JakeWharton的避免OOM建议
Clear Cache memory of Picasso
源作者:http://blog.csdn.net/ashqal/article/details/48005833
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 【Android】使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- 使用Picasso加载图片的内存优化实践
- Thinking In Java阅读日记1
- RecyclerView文字水平滑动可点击且item点击变色Demo
- 基础知识(一)matlab与c++混合编程之环境搭建
- [OpenLayers 3]地图所有组成部分
- Android local socket学习总结
- 使用Picasso加载图片的内存优化实践
- poj 3414 Pots (BFS + 记录路径)
- hdu 5932: Backpack on Tree 贪心+dp
- Fragment 中获取父Activity控件
- Linux --- vim命令
- 基础知识(二)matlab与c++混合编程之经验笔记
- iOS App 崩溃报告符号化,.ips崩溃报告文件分析
- 8天学通MongoDB——第六天 分片技术
- 让你的微信不再被人撤回消息