Android图片加载框架Glide源码解析(一)

Glide的基本使用

说到现下Android开发中热门的第三方框架,就会谈到图片加载框架Glide这个框架,在大部分的APP开发中都会有Glide的影子,为什么Glide被广泛使用呢?Glide官方文档是这样描述的:

Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。
Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。Glide的Api是如此的灵活,开发者甚至可以插入和替换成自己喜爱的任何网络栈。默认情况下,Glide使用的是一个定制化的基于HttpUrlConnection的栈,但同时也提供了与Google Volley和Square OkHttp快速集成的工具库。
虽然Glide 的主要目标是让任何形式的图片列表的滚动尽可能地变得更快、更平滑,但实际上,Glide几乎能满足你对远程图片的拉取/缩放/显示的一切需求。

那么Glide在我们开发中究竟是怎么样使用的呢?

1、使用要求

Min Sdk Version - 使用 Glide 需要 min SDK 版本 API 14 或更高。
Compile Sdk Version - Glide 必须使用 API 27或更高版本的 SDK 来编译。
Support Library Version - Glide 使用的支持库版本为 27。

2、Glide库的引入

Android studio中Gradle配置:
在root的build.gradle中增加下面配置,从maven仓库中引入:

repositories {
     mavenCentral()
     maven { url 'https://maven.google.com' }
}

并在app的build.gradle中增加对glide的依赖,配置如下:

dependencies {
     implementation 'com.github.bumptech.glide:glide:4.7.1'
}

注: 如果你需要使用不同的支持库版本,你需要在你的 build.gradle 文件里去从 Glide 的依赖中去除 "com.android.support",例如:

dependencies {
    implementation ("com.github.bumptech.glide:glide:4.7.1") {
        exclude group: "com.android.support"
    }
    implementation "com.android.support:support-fragment:26.1.0"
}

3、Glide加载图片基本方式

特别说明:Glide 现在最新版是v4,与之前的v3版本在使用上有比较大的差异,主要改动是Glide库处理选项(centerCrop(), placeholder() 等)的方式,V4版本增加RequestOptions类处理选项。因此在本文中主要V4版本的用法。

1.简单常用的方式

使用Glide加载图片很简单,一行代码足以:

String myUrl = "http://img.zcool.cn/community/0117e2571b8b246ac72538120dd8a4.jpg@1280w_1l_2o_100sh.jpg";
ImageView imageView = (ImageView)findViewById(R.id.iv_background);
Glide.with(fragment)
.load(myUrl)    //myurl表示图片的url地址
.into(imageView);//imageView表示加载的图片要显示在imageView上

既然有加载,就有相应的取消加载方式,同样很简单:

Glide.with(context).clear(imageView); // 取消加载图片

注:尽管及时的取消不必要的加载是很好的实践,但不是必须的操作。因为在实际中的Activity、Fragment在实例销毁的时候,Glide自身会自动取消加载。

2.使用注解处理器的方式

这种方式时使用注解的方式,实现的。在使用注解方式,务必要在App的build.gradle的dependencies中引入下:

annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'

在Application模块中,通过创建一个带有@GlideModule注解,并继承AppGlideModule的类。这个类能够生成一个流式API,内嵌了多种选项,如下:

package com.example.myapp;

import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;

@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}

通过编译就好生成一个默认名称为GlideApp的类,在Application中就可以按下方式使用来完成加载图片功能:

RequestOptions options = new RequestOptions();
options.placeholder(placeholder)
            .fitCenter();
GlideApp.with(fragment)
   .load(myUrl)
   .apply(options)
   .into(imageView);

4、Glide的其他设置

1.占位图设置

在实际图片的加载过程中,会经常出现图片加载缓慢的问题,这个时候需要展示该图片的位置就显示了一片空白,体验效果很不友好,因此Glide提供了占位图,可以预设置一个默认的图片,在实际的图片未加载完成时,显示这个默认图片,提高用户体验。使用方式如下:

//通过使用RequestOptions去设置占位图及加载错误时显示图
RequestOptions options = new RequestOptions();
options.placeholder(R.drawable.ic_default) //这里设置占位图
            .error(R.drawable.ic_error) ;//这里设置图片加载错误时要显示的图
Glide.with(activity)
    .load(url)
    .apply(options)            
    .into(imageView);

placeholder()和error()参数都是int类型,即使用本地资源对应的id,可能主要考虑到加载速度快。

2.缩略图

设置缩略图,与设置占位图有所不同,可以设置网络资源。使用如下:

Glide.with(activity)
      .load(url)
      .thumbnail(0.4f)
      .into(imageView);

意思很简单,就是展示原来0.4倍大小的一个缩略图。

3.动画开关

从Glide 3.7版本开始,默认开启了动画开关。如需关闭动画可调用dontAnimate。
但是在V4版本之后动画设置移入到TransitionOptions中,有如下三种:
GenericTransitionOptionsDrawableTransitionOptionsBitmapTransitionOptions

Glide.with(this)
    .load(url)
    .transition(DrawableTransitionOptions.withCrossFade())            //淡入淡出动画
    .apply(RequestOptions.noAnimation())        //关闭动画
    .into(imageView);

默认情况下动画时间是300ms。

4.图片缓存

内存缓存
为了实现图片快速加载,Glide帮我们实现了图片缓存功能,如果不需要使用则可调用skipMemoryCache(true)告诉Glide跳过内存缓存。
注意:该方法之对内存缓存有影响。

磁盘缓存
由于手机内存使用有限,内存资源比较珍贵,不可能将所有的图片资源缓存的内存中,因此为了提高加载效率,Glide还采用了磁盘缓存的方式。
磁盘缓存也是默认开启的,当然也可以关闭,方式如下:

Glide.with(activity)
    .load(url)
    .apply(RequestOptions.skipMemoryCacheOf(true)    //取消内存缓存
        .diskCacheStrategy(DiskCacheStrategy.NONE))    //取消图片磁盘缓存    
    .into(imageView);

缓存设置同样式通过RequestOptions进行设置的。

5.显示gif和video

Glide可以加载和显示一个gif,使用方式很简单,如下:

Glide.with(activity)
      .asGif()
      .load(url)
      .into(imageView);

注:这里如果加载的不是一个gif动画,将无法显示,所以asGif慎用。
Glide加载video只能针对本地的视频。

6.其他功能

Glide还有其他的功能,比如自已自定义缓存策略、设置优先级等。这里就不多说了。可以看看RequestOption类。

5、总结

1.针对两种方式的使用,可根据个人喜好自行选择;

2.Glide使用时,对url进行空检查并不是必须的,如果url为空,则会清空View的内容或者使用设置的默认图片资源;

3.使用在列表(ListView、RecyclerView等)中由于View的复用,因此针对在之前的位置上,用 Glide 进行过加载操作的情况,那么在新的位置上要重新into(view)操作,或调用clear()API 停止 Glide 的工作。否则可能会出现这样一个情况:你已经对一个view设置好了Drawable,但该 view 在之前的位置上使用 Glide 进行过加载图片的操作,在Glide 加载完毕后可能会将这个view改回成原来的内容,即没有设置成功问题。

至此,Glide开源框架的使用就是这么的简单,到这里就讲完了。
后面会从源码的角度对Glide进行分析。

本文参考文档:
Glide官方文档
Glide源码


Android图片加载框架Glide源码解析(一)
Android图片加载框架Glide源码解析(二)

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

推荐阅读更多精彩内容