Glide在许多方面和Picasso都非常的相似。
工程导入:
Picasso:
Picasso.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
Glide:
dependencies {
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.android.support:support-v4:22.0.0'
}
Gilde需要多添加一个Android Support Library v4,不过现在Android Support Library v4包基本上是所有Android工程的基础包了,问题不大。
基本使用:
将图片加载到ImageView的方式,两者基本上一模一样:
Picasso:
Picasso.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
Glide:
Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
不过虽然看上去非常像,但是在细节处Glide还是要比Picasso好。Gilde不仅仅只能接受Context还可以接收Activity或者是Fragment,Context参数会自动从他们里面提出,好处显而易见吧?Context会随着Activity或者是Fragment的生命周期销毁等等。
默认的Bitmap格式:
下面是图片加载的结果对比(将1920x1080的图片加载到768x432的ImageView中):
你可能会发现Glide加载的图片质量会比Picasso差一点(感觉区别其实很小)。Why?那是因为Glide默认的Bitmap格式是RGB_565,相对于Picasso的ARGB_8888,内存的占有率仅仅是它的一半。
下面有张内存消耗的对比图(系统已经使用8MB左右)
如果你觉得Glide加载的图片够清楚当然最好,如果觉得这图片的清晰度并不能满足你,你可以new 一个类继承GlideModule,如下:
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.
}
}
并且在清单文件中配置:
<meta-data android:name="com.inthecheesefactory.lab.glidepicasso.GlideConfiguration"
android:value="GlideModule"/>
然后图片就变得更好了:
再看看内存的消耗情况,可以看出虽然Glide现在消耗是比之前多2倍多,但是Picasso仍然要比Glide多许多:
(这图是有问题... 意思明白就好)
原因是Picasso加载了完整尺寸的图片(1920x1080)到内存中,然后在绘制的时候让GPU(图形处理器)重新测量真实的尺寸,而Glide则是加载准确的ImageView的尺寸(768x432)到内存中。当然你也可以改变Picasso的加载图片的参数:
Picasso.with(this)
.load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
.resize(768, 432)
.into(ivImgPicasso);
问题是这样你就需要手动的测量ImageView的尺寸,或者说你的ImageView必须要有准确的尺寸(不能够设置成wrap_content),你也可以这样简单的设置:
Picasso.with(this)
.load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
.fit()
.centerCrop()
.into(ivImgPicasso);
虽然内存消耗基本一致了,但是我必须说GIide这方面做的比Picasso要好很多,它是自动去测量ImageView的尺寸的。
磁盘缓存:
默认的磁盘缓冲方面两者大相径庭。同样的Full HD 的照片加载到ImageView中,当查看缓存文件的时候发现,Glide的缓冲尺寸的(768x432),Picasso是完整的尺寸(1920x1080)
当我调整不同尺寸的ImageView的时候,无论怎么改变,Picasso加载的始终是同一种类型的Image(full-size)。Glide就不同了,它会在缓存文件中生成不同尺寸的文件包用来储存不同尺寸的图片。不过当一张图片已经加载过了,而你改变了尺寸,那么它又要再加载一次相同的图片,只是尺寸不同而已。
很显然,如果第一次ImageView的尺寸是200x200的,另外一个ImageView的尺寸是100x100的,两个展示是同一张图片,那么你就需要下载两次图片了。
当然你也可以配置Gilde中的参数,让它和Picasso一样加载full-size的图片:
Glide.with(this)
.load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(ivImgGlide);
这样下次无论怎么改变ImageView的大小,它都不会再去重新加载不同的图片了,而是会从缓存中拿到full-size的图片改变它的大小然后展示。
其实GIide这样设计图片加载的方式有一个好处,加载和展示图片的速度特别快,因为初次显示图片的时候,Picasso由于加载是full-size的图片所以需要调整大小,
其实两种加载图片的方式各有优缺点,但是我更倾向于用Glide,因为它更快,即使有些时候它需要更多的磁盘空间去缓存不同尺寸的图片。
Glide可以做到Picasso不能做到的:
Glide可以加载GIF动画到ImageView,而Picasso不能。
上文提到过,Glide可以随Activity或者Fragment的生命周期暂停或者销毁对象,而Picasso不行。(不过我发现GIF的使用还是很占用内存的,谨慎使用)
Library的大小:
以及方法的数量:
总结:
没有谁优谁劣,两者各有千秋。Glide的内存缓存机制相对比Picasso更好,它让图片加载显示的速度更快,也在一定程度上避免了OutOfMemoryError。在GIF动画的加载方面也是优于Picasso。但是Picasso在图片质量方面是远优于Gilde的。
附上原文地址:(应该是要科学上网的)
https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
(英语4级刚过,翻译的有点烂,主要是为了自己学习,有错误欢迎指出,有条件的自己去看原文更更好)