**前言
load()
可以传图片的网络地址、Drawable 等。
into()
一般传 ImageView 。
发起加载图片请求
当我们用 into() 方法加载图片时,就是发起了一次图片加载请求;
执行解码任务
我们在 load() 方法中设置的图片来源会传到 DecodeJob 中,DecodeJob 就会被 Engine 提交到线程池中开始执行;
加载图片
当 DecodeJob 对图片解码完成后,就会把图片加载到 ImageView 中;
接下来会以这三个步骤为基础来展开 Glide 的图片加载流程,下面是每个大节讲解的内容。
加载请求 Request
加载目标 Target
加载引擎 Engine
解码任务 DecodeJob
1.1 Request
1.1.1 请求构建器 RequestBuilder
绑定生命周期
监听网络状态
创建请求构建器
启动请求
1. 绑定生命周期
在 Glide 中,一个 Context 对应一个 RequestManager,当我们调用 with() 方法时,RequestManager 会用对应的 Context 创建一个 RequestManagerFragment 。
RequestManagerFragment 是一个无布局的 Fragment,主要是用来做生命周期关联的,当这个 Fragment 感知到 Activity 的生命周期发生变化时,就会告诉请求管理器,让它去做暂停请求、继续请求和取消请求等操作。
如果我们用的是 ApplicationContext 加载某张图片,那就意味着这次图片加载操作的生命周期是与应用的生命周期绑定的。
2. 监听网络状态
RequestManager 中有一个网络连接监听器 RequestManagerConnectivityListener ,它实现了ConnectivityListener 接口,每次网络状态切换时,RequestManager 就会重启所有的图片加载请求。
3. 创建请求构建器
我们在加载图片时调用的 load() 方法是 RequestManager 的方法,调用这个方法其实是创建了一个请求构建器 RequestBuilder,RequestManager 中有很多创建 RequestBuilder 的方法,比如 asDrawable()、asBitmap() 、asFile() 等,这些方法对应着不同泛型参数的 RequestBuilder 。
load() 方法支持下面这些类型的参数。
Bitmap
Drawable
String
Uri
URL
File
Integer(resourceId)
byte[]
Object
4. 启动请求
RequestManager 的 track() 方法调用了目标跟踪器 TargetTracker 的 track() 方法,还调用了请求跟踪器 RequestTracker 的 runRequest() 方法 。
TargetTracker
TargetTracker 实现了 LifecycleListener ,它会根据页面生命周期播放和暂停动画,比如暂停 Gif 动画。
RequestTracker
RequestTracker 的 runRequest() 方法调用了 Request.begin() 方法。
在 Request 的 begin() 方法中会获取 View 的尺寸,获取到了尺寸后就会调用 Engine 的 load() 方法启动图片加载请求。
1.1.3 Request 的 6 种状态
前面讲到的 Request 具体就是 SingleRequest ,SingleRequest 中有一个 Status 枚举类,包含了请求的 6 种状态。
1. 待运行 PENDING
当我们通过 into() 创建了一个 SingleRequest 后,该 Request 就进入了待运行状态。
2. 已清除 CLEARED
每次我们用 into() 方法加载图片时,RequestManager 都会先看下我们传入的 Target 是否有对应的 Request ,如果有的话就会调用该 Request