Android学习笔记--Picasso vs Glide

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级刚过,翻译的有点烂,主要是为了自己学习,有错误欢迎指出,有条件的自己去看原文更更好)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值