前言
Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片比较。在Android中的加载网络图片是一件十分令人头疼的事情,在网上有着许多关于加载网络图片的开源库,可以让我们十分方便的加载网络图片。在这里介绍一下Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide的一些使用以及最基本的用法介绍。
本文主要从以下几个方面对上述5个图片库做一个简单的比较,也是为了对之前的版本做一个修正:
5大图片库对比
Universal-Image-Loader
- imageView是一个ImageView实例
- ImageLoader.getImageListener的第二个参数是默认的图片resource id
- 第三个参数是请求失败时候的资源id,可以指定为0
- ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);
- mImageLoader.get(url, listener);
volley
Volley提供了一个新的控件NetworkImageView来代替传统的ImageView,这个控件的图片属性可以通过.
- mImageView.setImageUrl(url, imageLoader)来设定。而且,这个控件在被从父控件detach的时候,会自动取消网络请求的,即完全不用我们担心相关网络请求的生命周期问题。
mImageLoader = new ImageLoader(mRequestQueue, newBitmapLruCache);
if(holder.imageRequest != null) {
holder.imageRequest.cancel;
}
holder.imageRequest = mImageLoader.get(BASE_UR + item.image_url, holder.imageView, R.drawable.loading, R.drawable.error);
如果你的工程项目,是一个比较小的项目,或者要求不是很高的项目,处理比较简单的可以使用这个库,这个库是Google 2013 I/O 发布的一个开源库。使用这个库在图片的处理上,没有提供任何的图片处理的操作,个人感觉这个库主要在网络数据连接上比较好,在图片处理上还是不够完善,强大。
Picasso
Picasso加载网络图片的使用很简单,只需要一行代码就可以搞定。
Picasso.with(context) .load(url).resize(50, 50).centerCrop.into(imageView)
picasso是facebook开发一款图片加载库,有以下优点:
- 处理Adapter中的 ImageView 回收和取消已经回收ImageView的下载进程
- 使用最少的内存完成复杂的图片转换,比如把下载的图片转换为圆角等
- 自动添加磁盘和内存缓存
如果你的项目里面,对于图片有一些具体的要求的话,建议使用这个库,但是这个库当你需要对图片作一些具体的操作比如加载圆角矩形图片、裁剪图片为圆形时,需要你自己写一些操作,如果基础不够好的会感觉很困难。还有就是这个库我们只能看到结果,无法关心图片的下载过程。
其他:Fresco 中设计有一个叫做 image pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级文件)。
Fresco 中设计有一个叫做 Drawees 模块,方便地显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。Fresco 支持 Android2.3(API level 9) 及其以上系统。
解压后的图片,即Android中的Bitmap,占用大量的内存。大的内存占用势必引发更加频繁的GC。在5.0以下,GC将会显著地引发界面卡顿。
在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。Fresco 在低端机器上表现一样出色,你再也不用因图片内存占用而思前想后。此外,Android 本身的图片库不支持此格式,但是Fresco支持。
glide
Glide和Picasso都是非常完美的库。Glide加载图像以及磁盘缓存的方式都要优于Picasso,速度更快,并且Glide更有利于减少OutOfMemoryError的发生,GIF动画是Glide的杀手锏。不过Picasso的图片质量更高。
其使用也是非常的简单:
Glide.with(context).load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
Picasso和Volley对比
在使用图片加载库的时候,我们常常将Picasso和Volley放在一起做一个简单的对比。
依赖方式
Picasso
dependencies {
compile 'com.squareup.picasso:picasso:2.5.1'
}
Glide
dependencies {
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.android.support:support-v4:22.0.0'
}
注:Glide需要依赖Support Library v4。
使用
Picasso
Picasso.with(context).into(ivImg);
glide
Glide.with(context).load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
注:虽然两者看起来一样,但是Glide更易用,因为Glide的with方法不光接受Context,还接受Activity 和 Fragment,Context会自动的从他们获取。
采样率
可以看到Glide加载的图片质量要差于Picasso为什么?这是因为Glide默认的Bitmap格式是RGB_565 ,比ARGB_8888格式的内存开销要小一半。下面是Picasso在ARGB8888下与Glide在RGB565下的内存开销图(应用自身占用了8m,因此以8为基准线比较):
当然glide可以让我们设置采样率,创建一个新的GlideModule将Bitmap格式转换到ARGB_8888。
public class GlideConfiguration implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// Apply options to the builder here.
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}
@Override
public void registerComponents(Context context, Glide glide) {
// register ModelLoaders here.
}
}
同时在AndroidManifest.xml中将GlideModule定义为meta-data,这样看起来就差不多了。
我们再来看看内存开销图,这次貌似Glide花费了两倍于上次的内存,但是Picasso的内存开销仍然远大于Glide。
原因在于Picasso是加载了全尺寸的图片到内存,然后让GPU来实时重绘大小。而Glide加载的大小和ImageView的大小是一致的,因此更小。当然,Picasso也可以指定加载的图片大小的,这样就为我们减少了内存的开销:
Picasso.with(this).load("http://nuuneoi.com/uploads/source/playstore/cover.jpg").resize(768, 432).into(ivImgPicasso);
所以这里,在灵活性上Glide略胜一筹。因为 Glide可以自动计算出任意情况下的ImageView大小。
缓存策略
Picasso和Glide在磁盘缓存策略上有很大的不同。Picasso缓存的是全尺寸的,而Glide缓存的是跟ImageView尺寸相同的。如果加载的是RGB565图片,那么缓存中的图片也是RGB565。
尝试将ImageView调整成不同大小,但不管大小如何Picasso只缓存一个全尺寸的。Glide则不同,它会为每种大小的ImageView缓存一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。
具体说来就是:假如在第一个页面有一个200x200的ImageView,在第二个页面有一个100x100的ImageView,这两个ImageView本来是要显示同一张图片,却需要下载两次。
不过,你可以改变这种行为,让Glide既缓存全尺寸又缓存其他尺寸:
Glide.with(this).diskCacheStrategy(DiskCacheStrategy.ALL).into(ivImgGlide);
下次在任何ImageView中加载图片的时候,全尺寸的图片将从缓存中取出,重新调整大小,然后缓存。Glide的这种方式优点是加载显示非常快。而Picasso的方式则因为需要在显示之前重新调整大小而导致一些延迟。不过各有所长。
总结
- Universal Image Loader:一个强大的图片加载库,包含各种各样的配置,最老牌,使用也最广泛。
- Picasso: Square出品,和OkHttp搭配起来更配呦!
- Volley ImageLoader:Google官方出品,可惜不能加载本地图片~
- Fresco:Facebook出的,天生骄傲!不是一般的强大。
- Glide:Google推荐的图片加载库,专注于流畅的滚动,更适合于列表大量图片。