一个普通的App,肯定少不了图片的展示。而这些图片基本上都是要从网络上加载的,而不是预存在本地——首先那会使体积大增,当然更重要的是无法实现即时更新,毕竟很多图片是App上线后才制作发布的。因而从网络上加载图片就是Android开发的必修课了。实际上加载图片,本质上与下载其他文件并无二致,就是一个从网络上下载图片文件,下载完毕之后显示出来罢了。但是凡是涉及到网络的,必然有一个UI主线程和子线程的问题,Android中是不允许在主线程中进行耗时操作的,所以我们肯定要在子线程中加载图片,然后在主线程中显示图片,而处理图片又需要跟Bitmap打交道,想要自己很好的实现网络图片加载会是一件麻烦事儿。所以啊,选择一款成熟好用的第三方库是一个明智的选择。
现在比较流行的图片加载库,有Facebook出品的Fresco,Square出品的Picasso和Google员工出品的Glide,都是出身名门。而曾经非常流行后来不再被维护更新的Android-Universal-Image-Loader则是大神Sergey Tarasevich(Github的ID是nostra13)的个人作品。由于UIL已经不再维护,所以除非你的老项目中还在使用又懒得替换,否则是不建议用的,今天也就不再把它列到对比中了,只对Fresco、Picasso和Glide进行对比。什么?还有个叫Volley的?能吃么?
先把Picasso排除掉
为什么这么说呢?其实Picasso毕竟是Square出品,而且API设计的简单易用,对开发者是比较友好的。但是它有硬伤,就是本身不支持GIF动画,缓存图片的时候只是把原图给缓存了。而Glide简直就是个加强版的Picasso,支持GIF动画,加载速度更好,很关键的一点在于API设计完全继承了Picasso,缓存的时候还可以根据ImageView的大小来缓存相应尺寸的图片(而不仅仅是原尺寸)。简而言之,Picasso能做的事情,Glide全部能做到,而且还多了一些优点,所以,只要你不是对APK的体积苛求到了极致(Glide比Picasso大了大概300K),就使用Glide吧。
Fresco vs Glide才是重头戏
实际上Glide只是个人的开源作品,只不过因为作者在Google所以被大家另眼相待,而且Google官方的一些App也确实使用了Glide,性能表现很好,让大家很放心。相比较之下,Fresco则是Facebook官方Github帐号开源出来的,属于亲儿子,其性能之强大足以让包括Glide在内的任何同类库相形见绌。不过呢,我们需要的并不一定是最强的,而是最适合我们的。
开源库 | Glide | Fresco |
layout对象 | 原生ImageView | 特有的SimpleDraweeView |
是否需要初始化 | 不需要 | Fresco.initialize(this); |
能否显示加载进度 | 不能,需自己实现 | Yes |
图片加载质量 | RGB565 | ARGB8888 |
缓存级别 | 2级,内存和磁盘缓存 | 3级,2个内存级和1个磁盘级 |
缓存图像大小 | 原始大小和针对ImageView大小的result型 | 原始大小 |
圆角图像 | 需自己实现 | 设置RoundingParams |
从上面的表格中,可以看得出来Fresco更强大。实际上这个对比还不足以显示出Fresco的强大,毕竟那么大量的C++代码可不是用来玩的。值得注意的是,Fresco会让你的APK体积增大2-3MB,极端情况下会更多,如果你的应用原来就没多大,结果因为Fresco增加了很多,这就需要你权衡了。而Glide只有数百K,算是一个体积正常的第三方库。
在低版本手机里,应用在显示图片的时候容易出现OOM相信很多人是深有体会的,Fresco可以在最大程度上避免因大图片导致的OOM,当然Glide的表现也不错但还是比不上Fresco的。Glide的图片质量为RGB565,显示质量一般但体积较小,而Fresco则很大度的直接显示为最高质量的ARGB8888,在这种情况下还能保证良好的内存表现,就很能体现出Facebook的技术能力了。
那么如何在Glide和Fresco中进行选择呢?这就要因App而已了。如果你的应用中,不是很注重图片质量,也就是说每张图片的体积不大,不是一个以图片为主元素的应用,那么Glide就是一个非常合适的选择了,它不会让你的应用体积臃肿,而且可以很好的完成流畅加载图片并显示出来的任务。而如果你的应用中,图片显示占了很大的份量,甚至就是一个以显示图片为主的应用,那么不必太在意体积了,直接上Fresco吧,这个时候更好的图片质量和更好的内存处理才是王道。
评论