实现看这里 -> 图片库的封装实践
引文
目前比较主流的开源第三方库有这几个:Fresco、Glide、Android-Universal-Image-Loader(UIL)、picasso、Cube ImageLoader
有点多,先排除掉一两个,Cube ImageLoader是淘宝使用的库,github上的文档已经重定向到fresco,直接不看了;picasso性能上也是比Glide、Fresco差,还有更好的选择的情况下,暂时略过了。重点对比在Fresco、Glide、UIL。
Fresco
https://github.com/facebook/fresco
facebook提供的一个开源库,文档很全,更新很频繁,功能很全,略重
优点:
- 0、能满足基本要求、可选要求
- 1、多线程图片加载/下载
- 2、支持渐进性图片加载(先低清,后高清)(jpeg/webp)
- 3、支持webp、支持大GIF图
- 4、内存优化得最好
- 5、文档很全
缺点:
- 1、很重(大/2M+)
- 2、使用到原生的支持(使用ashmem,优化android5.0以下bitmap对象回收)
- 3、需要使用/继承 到它提供的DraweeView(MVC模型,DraweeView;DraweeView 是 Fresco 的“门面”,负责显示由 DraweeHierarchy 提供的数据(Placeholder、Actual Image、Progress Drawable etc,DraweeController 作为幕后)
Glide
https://github.com/bumptech/glide
bumptech提供的,google推荐的一个库(2014 Google IO),比较轻
优点:
- 0、能满足基本要求
- 1、比较轻(465K),在性能方面也能媲美Fresco
- 2、有内存缓存、磁盘缓存策略
- 3、有生命周期的概念(主要是对请求进行pause,resume,clear),而且其生命周期与Activity/Fragment的生命周期绑定。
缺点:
- 1、近一年没怎么更新了,对一些新特性也没有支持到(webp等)
Android-Universal-Image-Loader(UIL)
https://github.com/nostra13/Android-Universal-Image-Loader
现在使用最广的开源库,支持主流图片缓存的绝大多数特性
优点:
- 0、能满足基本要求
- 1、多线程图片加载/下载
- 2、可以自定义配置、多级缓存、能监听到图片加载/下载进度
缺点:
- 1、对一些新特性支持不到(jpeg、webp、https)
- 2、15年11月后停止了维护
分析:
- 0、UIL已经没更新了,暂时不考虑了。
- 1、如果考虑支持https/jpeg/webp等新的特性,用Fresco其实更好。不过缺点也很明显,就是很重;image view层面也要继承它提供的一个基类。
- 2、如果不考虑这些新特性,用Glide会好一点,理由是比较轻,而且性能上也可以和Fresco可以媲美。
3、实际对比
Fresco 提供了一个简单的对比的例子:
https://github.com/facebook/fresco/tree/master/samples/comparison/src/main/java/com/facebook/samples/comparison
单从对比的例子来看,Glide在加载本地资源上是最流畅的,网络方面的对比不是很明显。
结论:
虽然个人比较推荐使用Fresco。一个是性能是最好的,另一个是,如果要使用webp或jpeg会简单一点,还有一个是可以逼自己去Handle。但是Fresco太重了,适合很多图片的应用。
如果是轻量级的话,还是建议用Glide
PS:我是如何封装的
参考
[1] : 图片缓存