一概要:
Google在2014的开发者论坛上,向我们介绍了一个开源的图片加载的类库Glide。作者BumpTech(碰撞科技)。这个
库被广泛的运用在了Google的开源项目中。
能够被Google如此推崇一定有其过人之处。研究一下发现picaso惊人的类似。所以干脆和Picaso做类比讲解。
二配置:
Glide:Glide需要依赖support-v4库。
//使用glide
compile 'com.github.bumptech.glide:glide:3.8.0'
compile 'com.android.support:support-v4:23.3.0'
Picaso:
compile 'com.squareup.picasso:picasso:2.5.2'
三使用:
简单使用:(加载一张图片)
Picasso:
Picasso.with(context)
.load("http://img1.imgtn.bdimg.com/it/u=1861947898,2677579279&fm=26&gp=0.jpg")
.into(iv_content);
Glide:
Glide.with(context)
.load("http://img1.imgtn.bdimg.com/it/u=1861947898,2677579279&fm=26&gp=0.jpg")
.into(iv_content);
#就如我们所说的Picasso与Glide非常的类似。但是Glide使用更方便,因为Glide.with参数不仅接受Context,还接受
Activity、Fragment。Glide会自动的从中获取Context。
#当Activity与Fragment作为Glide.with的参数时,Glide的图片加载会与它们的周期保持一致,(例如Activity)当Activity
Stop时,图片停止加载;当Resume时图片重新加载。
Gradle的默认的Bitmap格式是RGB_565
#Gradle默认的Bitmap格式是RGB_565,Picasso默认的Bitmap格式是ARGB_8888,所以Gradle与Picasso加载同尺寸
图片时内存开销小一半(RGB_565格式的Bitmap比ARGB_8888格式的Bitmap内存开销小一半),但是显示的图片质量
要比Picasso显示的图片差。
#如果你不满意Gradle默认Bitmap格式,我们可以自己定义加载的Bitmap格式:自定义GradleModule,然后在
AndroidManifest.xml中注册,最后在proguard.cfg中声明不被混淆。
1,自定义GlideModule
public class MyGlideModule implements GlideModule{
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//设置默认Bitmap的格式
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
//设置内存缓存的策略
builder.setMemoryCache(new LruResourceCache((int) (Runtime.getRuntime().maxMemory()/8)));
//设置磁盘缓存的策略
builder.setDiskCache(new InternalCacheDiskCacheFactory(context,"glide_cache", 1024 * 1024 * 50));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
2,在AndroidManifes.xml中注册
<meta-data
android:name="com.example.songbinwang.littledemo.glide.MyGlideModule"
android:value="GlideModule"></meta-data>
3,在proguard.cfg中声明不被混淆。
-keepnames class com.mypackage.MyGlideModule
# or more generally:
#-keep public class * implements com.bumptech.glide.module.GlideModule
#就算Glide把默认的Bitmap格式改成了ARGB_8888,但是Picasso的所耗的内存依然高于Glide。因为Picasso默认加载
全尺寸图片,而Glide默认加载与ImageView大小一样的图片。也就是说Glide默认对图片进行了压缩。
当然Picasso也是可以加载指定大小的图片(如果要适应ImageView,你必须提前计算好ImageView的大小):
Picasso.with(this.getApplicationContext())
.load("http://img0.imgtn.bdimg.com/it/u=1418485010,2783104222&fm=26&gp=0.jpg")
.resize(768,432)
.into(iv_picasso);
另一种方法相对简单,(前提是ImageView的大小是定值,不能是wrap_content)
Picasso.with(this.getApplicationContext())
.load("http://img0.imgtn.bdimg.com/it/u=1418485010,2783104222&fm=26&gp=0.jpg")
.fit()
.centerCrop()
.into(iv_picasso);
这样操作后,Glide与Picasso的内存开销基本差不多了,但是在这个问题上Glide完胜Picasso,因为Glide可以计算
ImageView任何情况下的大小。
磁盘缓存
#首先Picasso只缓存全尺寸的图片,不管你之前怎么设置加载图片的大小;Glide则会为每一种大小的ImageView缓存相
同大小的图片,尽管一张图片已经缓存过一次,但是假如你要在另一个地方以不同的尺寸显示,需要重新下载,调整成新
尺寸的大小,然后将这个尺寸也缓存起来。
具体说就是:你在第一个页面有一个200x200的ImageView,在第二页面有一个100x100的ImageView,两个ImageView
显示的是同一张图片,却要下载两次。
但是Glide可以改变这种现象,让Glide即缓存全尺寸的图片,也缓存其他尺寸的图片。
Glide.with(this)
.load("http://img0.imgtn.bdimg.com/it/u=1418485010,2783104222&fm=26&gp=0.jpg")
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(iv_glide);
下载在任何ImageView再加载这张图片时,会从缓存中加载这张全尺寸图片,重新调大小,然后缓存。
Glide的这种方式显示图片非常快,Picasso则因为每次加载图片都需要重新调整大小导致一些延迟。及时你添加了(noFade())
#因为Glide缓存策略导致Glide缓存图片会过于频繁。因此Glide需要更大的空间来缓存。
Glide能做到,Picasso做不到的。
#Glide能够在gif格式的图片,而Picasso不能。因为Glide与Activity、Fragment的生命周期一样。所以在Activity stop时Gif
也会停止,Activity Resume时Gif重新启动。尽管如此Glide加载Gif依然会消耗很多内存。
#Glide能够将任何的本地视频解码成一张静态图片。
#Glide可以配置图片的显示动画,而Picasso只有一种动画:fading in。
Glide.with(this)
.load("http://img0.imgtn.bdimg.com/it/u=1418485010,2783104222&fm=26&gp=0.jpg")
.crossFade(android.R.anim.fade_in, 300)//可以换成自定义的动画
.into(iv_glide);
#支持缩略图,
thumbnail(
float ratio
), ratio为缩略图与要加载的图片的的比例,ratio属于(0,1)。
Glide.with(this)
.load("http://img0.imgtn.bdimg.com/it/u=1418485010,2783104222&fm=26&gp=0.jpg")
.thumbnail(0.1f)//缩略图为要加载图片的1/10。
.into(iv_glide);
四总结:Glide与Picasso都是非常完美的库,Glide加载图片与磁盘缓存的方式都优于Picasso。速度更快,更有利于减少
OutOfMemory,Gif是Glide的杀手锏。Picasso加载的图片质量更高。
参考:
1,http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2650.html
2,https://muzhi1991.gitbooks.io/android-glide-wiki/content/chapter1.html