Glide初步使用小结

前言

图片的加载一直是安卓开发中的一个重要环节,因为相较于文字,图片的数据量非常大。处理不好图片,也就无法提供给用户一个良好的使用体验。而Glide就是为了加载图片而生的一个开源库。

1. 为何使用Glide?

在我最开始接触安卓的时候,是没有用任何图片加载库的,直接从网络获取数据流,转成Bitmap,然后手动装到ImageView里。后来发现有Picasso这个库,只要有url就能自动帮助加载,不要太方便。此后的一段时间就一直用Picasso。
但随着时间的推移,我发现Picasso这个库的缓存支持很奇怪。网上有的说要和Okhttp一起使用才有缓存,还有的说就没有硬盘缓存功能。总之我查了半天也没有头绪。因此我决定换一个支持本地缓存的图片库。
刚开始是用Fresco的。这个库,不能说不好,但是有着一些不方便的地方。第一个是体积太大,一个库直接把安装包增加了1M;第二个是它需要控件支持,把原来的ImageView改成这个库的自定义控件,这样的话和很多其他的控件库就不兼容。最典型的是Photo View这个库,也是要改控件的。因此,当要求放大图片,而且支持手势缩放的时候,Fresco这个库自带的功能无法满足,而且也限制了不能用其他的库,于是最终没有选择这个库。
之后,我选择了Glide。从我的使用经历,其优点如下:

  • 强大的缓存支持
  • 支持GIF
  • 灵活便捷的使用方式
  • 支持和常见网络处理库的耦合
  • 不需要修改控件

缺点几乎没有,硬要说有的话就是设置不当会加载很慢,还有少数情况下我自定义的rounded image view变成了方的。

2. 把Glide加入项目

Glide的整合非常方便,把下面的代码整合到gradle文件即可:

repositories {
mavenCentral() // jcenter() works as well because it pulls from Maven Central
}
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
}

此外,Glide还支持和Okhttp3,Volley等常见网络处理库的耦合,也需要进行一些设置。比如想要和Okhttp3进行耦合,在dependencies里面就需要加入compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'

3. Glide基础使用

Glide的使用和Picasso非常类似。

Glide.with(mContext).load(url).into(ImageView); // 基础版
Glide.with(mContext).load(url).override(width,height).error(R.drawable.ic_img_err).placeholder(R.drawable.ic_img_placeholder).diskCacheStrategy(DiskCacheStrategy.SOURCE).dontAnimate().centerCrop().into(ImageView); // 正常版

Glide的基础使用至少需要三个参数,第一个是context参数,第二个是图片源参数,可以是url也可以是drawable的source id,第三个则是加载的目标控件。
可以选择的参数就比较多了。override可以指定宽度和高度,error指定失败时显示的图片,placeholder指定加载时使用的图片,diskCacheStrategy指定缓存策略,之后会提到,dontAnimate隐藏过渡动画,centerCrop裁剪图片适应控件比例。此外,还有asBitmap(), asGif(), thumbnail()等等方法,总之功能比较全面。

4. Glide全局设置

Glide还支持全局设置,可以规定缓存空间的大小,解码格式,还有一些进阶的设置。详细信息请参考官方说明
一份比较简单的设置文件如下:

public class MyGlideModule implements GlideModule {
    @Override public void applyOptions(Context context, GlideBuilder builder) {
        // Apply options to the builder here.
        int cacheSize100MegaBytes = 104857600*2; //200MB
        MemorySizeCalculator calculator = new MemorySizeCalculator(context);
        int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
        int defaultBitmapPoolSize = calculator.getBitmapPoolSize();

        int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
        int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);

        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888)
                .setDiskCache(new ExternalCacheDiskCacheFactory(context, cacheSize100MegaBytes))
                .setMemoryCache( new LruResourceCache( customMemoryCacheSize ))
                .setBitmapPool( new LruBitmapPool( customBitmapPoolSize ));
    }

    @Override public void registerComponents(Context context, Glide glide) {
        // register ModelLoaders here.
    }
}
5. Glide缓存使用

Glide默认是使用memory cache和disk cache的result模式的。
memory cache可以用skipMemoryCache(true) 来取消。
diskCacheStrategy有4种选择:None, All, Source, Result。None就是取消,Source是只缓存源文件,Result是缓存处理过的文件,All是把Source和Result都缓存。
很明显,要缓存的越多,第一次加载也就越慢。对于经常改变的图片,None是不错的选择;对于周期性的图片,可以用Source;对于不怎么改变的图片,可以考虑All或者Result。
此外,对于Gif来说,官方的建议是只使用Source模式。

6. Glide和Gif

虽然Glide有asGif()方法,但根据我的实验,就算不用,还是可以直接加载Gif。当然我指的是目标内容,假如想把Gif作为加载动画,用两个Image View可能比placeholder要靠谱一些,或者尝试一些其他的加载动画的库比如AVLoadingIndicator等等。
此外,由于Glide对控件没有要求,可以考虑和Gif Drawable库一起使用来获得更好的效果。

7. 总结

Glide是相当方便好用易上手的库。

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

推荐阅读更多精彩内容