图片框架 - Glide 4.11.0源码走读
本篇文章对Glide最新4.11.0版本做一个宏观解析,目的是把握下Glide的大框架,有了宏观了解之后,再剖析细节就比较容易了。
源码解析:
Glide.with(this).load(url).into(imageView);
按如上代码,总结流程图和类图来从执行流程和类关系两个维度来解析下Glide的基础框架。
一、流程图
1.1 with
with主要干两件事:
-
图片加载绑定对应页面生命周期;
生命周期分为application 和 非application两种。分别通过ApplicationLifecycle、ActivityFragmentLifecycle来管理生命周期。 -
初始化RequestManager;
1.2 load
流程以加载String url为例。
load主要干一件事情:
- 通过RequestManager初始化RequestBuilder。确认加载的资源类型以及一些参数的初始化,为后续into做准备。
1.3 into
into过程
into主要干了三件事: - 封装并发起request。
- request获取图片数据。
- 将图片显示到View上。
request获取图片逻辑:
Engine图片资源获取管理逻辑
图片获取方式
优先级:当前正在使用的缓存 > LruCache > 网络/磁盘
二、类图
这里只梳理下核心类的关系
Glide类关系图
简单总结下理解:
Glide.with(this).load(url).into(imageView);
Glide是一个单例的调用入口类。
with:初始化RequestManager,绑定生命周期。
load:加载资源并初始化RequestBuilder。
into:由RequestBuilder构建Request和Target交由RequestManager去处理。
核心功能全部交给RequestManager来处理:
通过with、load、into三板斧后,给到RequestManager的工作内容:
- 绑定对应页面生命周期。
- 处理Request获取图片资源。
- 将图片资源加载到Target对应的目标控件上。
RequestManager左膀右臂TargetTracker、RequestTracker,前者负责绑定页面生命周期,后者负责剩下两项工作。
Request通过Engine来管理图片加载,按:活跃内存>LruCache>网络/磁盘 优先级获取图片资源。具体图片获取由对应的DataFetcher来处理,然后交给DecodeJob去做图片的解码。最后通过回调返回给Target去设置图片。