深入对比Glide 和 Picasso

Glide 和 Picasso 可以说是目前 Android 上最流行的图片加载库了。大部分安卓应用开发人员都有使用过这两个库在他们的开发工作中。这两个库也都确实提供了大量图片加载的功能,而且也都经过了很多应用的检验,是可靠可信的。表面看上去似乎两者工作原理很相似,但是实际上是有着很大差别的,主要体现在下面几个方面:

  • 下载图片的方式
  • 图片的缓存机制
  • 加载到内存的机制

本文主要会围绕这几个方面来深入研究和对比两个库的差异,从而给开发者们提供参考。
对比的版本是 Glide v3.7.0 和 Picasso v2.5.2 的版本。

导入库到项目中

Picasso 和 Glide 都在 Jcenter 上有建立库,所以只需要简单的在添加dependency 即可

Picasso

dependencies {
    compile 'com.squareup.picasso:picasso:2.5.1'
}

Glide

dependencies {
    compile 'com.github.bumptech.glide:glide:3.5.2'
}

库的大小和方法的数量

对比两个.jar 库的大小,Glide 要比 Picasso 大很多,基本上是 Picasso 的3.5倍:


1.png

从库的大小,我们就可以预见,Glide 的方法必然是要大于Picasso 的,Picasso 的方法 总共有849个,而 Glide 的有2678个:

2.png

使用方式

如果只是简单的从一个 URL 中下载图片,然后显示到 imageView 中,那么两个库的使用方式基本相似,也都非常的简单。同时两个库也都支持动画和大小的剪切,也可以设置加载时候的预设图片等功能:
Picasso:

Picasso.with(myFragment)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.into(myImageView);

Glide:

Glide.with(myFragment)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.crossFade()
.into(myImageView);

但是,Glide 这里有一个非常招人喜欢的地方,就是 Glide 在设计的时候,就有 Activity 和 Fragment 的生命周期。什么意思呢? 就是说你可以传递 Activity 或者 Fragment 的 context 给 Glide.with(), 然后 Glide 就会非常智能的同 Activity 的生命周期集成, 比如 OnResume 或者 onPause():

3.png

缓存大小

两个库也都支持缓存图片,都通过下载图片后,缓存到本地。但是这里对于缓存本地的机制,两个库是完全不同的做法。

Picasso 是下载图片然后缓存完整的大小到本地,比如说图片的大小是1080p的,之后如果我需要同一张图片,就会返回这张 full size 的,如果我需要resize,也是对这种 full size 的做 resize。

Glide 则是完全不一样的做法。Glide 是会先下载图片,然后改变图片的大小,以适应 imageView 的要求,然后缓存到本地。 所以如果你是下载同一张图片,但是设定两个不一样大小的 imageView, 那么Glide 实际上是会缓存两份。
换个角度来看,这里不仅仅是缓存的问题,比如一个 ImageView 要改变它的大小,PIcasso 就只需要下载一次 full size 的图片,但是 Glide 实际上就不仅仅是下载一次了,它需要去单独下载然后改变大小适配 imageView,因为对于 Glide 来讲,需要缓存不同大小的同一张图片。

从这点来看,似乎 Glide 的这种设计很有问题了?当然不是,这种做法也会带来一定的好处,在下面的memory中就会展示。

内存使用

Glide 默认是用的 RGB_555 的设定,PIcasso 则是用的 ARGB _8888的设定。为了公平起见,我这里修改了 GlideModule,让 Glide 也使用 ARGB _8888的格式,做法也很简单,新建一个类然后继承 GlideModule

<meta-data android:name="example.com.myanimation.GlideConfiguration" android:value="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.
    }
}

下面是两者加载的对比:

4.png

可以看出 Glide (大约8MB) 要比 Picasso (13 MB) 的少不少。其实这里就体现出了之前提到的 Glide 缓存的方式问题。Picasso 是缓存的 full size 图片的大小,而 Glide 是加载已经改变大小后的图片,显而易见使用的memory会小很多。 这样可以减少 OutOfMemoryError 的可能性。

加载图片的时间

这里先说明下,当尝试加载一个图片的时候,两个库都会采用先从缓存中读取,如果缓存中没有,再去下载的做法。

实际试验中,Picasso 会比 Glide 快一点。猜测可能的原因还是因为之前讲到的缓存机制导致,因为Picasso 是直接把图加载到内存中,而 Glide 则需要改变图片大小再加载到内存中去。这个应该是会耗费一定的时间。

1.gif

但是,当加载图片从内存中的时候,Glide 则比 Picasso 要快。其原理还是因为缓存机制的区别。因为Picasso 从缓存中拿到的图片,还要先去 resize 后,然后设定给 imageView,但是 Glide 则不需要这样。

2.gif

其他功能的对比

  • GIF 支持:Glide 支持 GIF。 对于加载 GIF 来说,Glide 只需要简单使用 Glide.with(...).load(...)。 但是 Picasso 是不支持的,因此如果你的应用中是需要加载 GIF 的话,那就只能用 Glide 了。

  • 灵活性:Glide 提供了非常多的配置,你可以非常灵活的根据你的需求来客制化,从而缩减 Glide 库的大小等。

结论

正所谓人无完人,经过一番对比,Picasso 和 Glide 各有千秋,那么到底我们应该用哪个库呢?这个还是回到应用的需求来看,比如你想要你的 app 小一些,没有那么多的额外功能,那么 Picasso 是你的首选。反之,比如你的应用中需要加载 GIF,或者对于内存的大小比较在意,那么 Glide 应该是不错的选择。
实际上,就我个人来看,Glide 要略优于 Picasso. 特别是支持 GIF,这个杀手锏啊!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • 这么久以来虽然经常用到一些图库,但是自己从来没有真正整理过我们使用过的这些东西有什么不同点,我们为什么要选择这个图...
    黑石ZB阅读 3,664评论 1 16
  • Glide 是一个 android 平台上的快速和高效的开源的多媒体资源管理库,提供 多媒体文件的压缩,内存和磁盘...
    帅气的欧巴阅读 2,735评论 1 18
  • 当朝阳大桥跑步的人群渐次离去,通道里空无一人,整个世界只剩下自己的心跳………6.11活动安排比较魔鬼,早上...
    一花一世界10000阅读 1,299评论 4 57
  • 太初,在奇点爆炸之后的那个瞬息 我们就彼此被对方的眼神捕获 深深的沉迷在这爱恋里 这爱,持续了亿万年 持续了亿万里...
    入红尘难阅读 319评论 2 4