Glide4.0源码全解析(二),load()背后的故事
来源:互联网 发布:java定义数组的方法 编辑:程序博客网 时间:2024/06/09 21:57
书接上文,上回书说到GlideAPP和.with()方法背后的故事,那么我们接着按照我们开始的思路,按照Glide基本加载步骤中的三步走,with()
,load()
,into()
,今天
我们来介绍一下load()
方法。
load()方法全面解析
通过上一篇文章Glide4.0源码全解析(一),GlideAPP和.with()方法背后的故事
我们可以知道.with()
方法返回的是GlideRequests
对象,
/** * @see Glide#with(Activity) */ public static GlideRequests with(Activity activity) { return (GlideRequests) Glide.with(activity); }
那么我们想要了解的.load()
一定是在 GlideRequests
类里面,那么先来看一下GlideRequests
这个类:
public class GlideRequests extends RequestManager { ... ... ...}
GlideRequests
是继承自RequestManager
(负责管理和请求Glide的请求类,后面再详细讲解)。 GlideRequests
中有如下方法:
总共有9个方法,其他的方法暂时先不去分析,我们先去分析一下我们的load(Object arg0)
方法。
该方法调用的是父类的super.load(arg0)
返回的是GlideRequest
对象。
那么我们去RequestManager
(上门提过)看一下里面的load(arg0)
方法。
先来看一下RequestManager API:
Class RequestManager API
/** *用于管理和启动Glide请求的类。可以使用activity、fragment和连接生命周期事件来智能地停止、 *启动和重启请求。通过实例化一个新对象,或者利用在Fragment和Activity生命周期处理中构建的 *优势,可以在Fragment或者Activity使用静态的Glide.load方法 */public class RequestManager implements LifecycleListener { /** * 一个helper方法,相当于调用asDrawable() * * @return 返回一个新的给定model的request builder */ public RequestBuilder<Drawable> load(@Nullable Object model) { return asDrawable().load(model); } /** *默认情况下,可以返回一个BitmapDrawable或GifDrawable,但是如果对其他可绘制的子类注册了 *额外的解码器,那么这些子类也可以返回。 */ public RequestBuilder<Drawable> asDrawable() { return as(Drawable.class); } /** *尝试使用仍和注册的资源去解码给定的类或子类 *@param resourceClass 需要解码的资源 *@return 一个新的加载给定资源类的request builder */ public <ResourceType> RequestBuilder<ResourceType> as(Class<ResourceType> resourceClass) { return new RequestBuilder<>(glide, this, resourceClass); }}
也就是说我们在调用.load(args)时候,Glide默认帮我们执行了asDrawable()
方法,asDrawable()
实际执行的是as(Drawable.class)
,最终as(Class<ResourceType> resourceClass)
返回一个RequestBuilder<>(glide, this, resourceClass);
。
到这里我们只是创建了一个RequestBuilder
,然后我们去看
public RequestBuilder<Drawable> load(@Nullable Object model) { return asDrawable().load(model); }
中的.load(model)
做了什么?
既然asDrawable()
返回RequestBuilder对象,那么我们就去RequestBuilder
类中一探究竟。
老规矩,先来看一下RequestBuilder API:
RequestBuilder API
/** * 设置要加载数据的特定模型 * * 这个方法至少要调用一次 */ @SuppressWarnings("unchecked") public RequestBuilder<TranscodeType> load(@Nullable Object model) { return loadGeneric(model); } private RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) { this.model = model; isModelSet = true; return this; }
上面的方法我们看到load(我们传入特定的modle)
到这里你可能会疑问:为什么必须至少调用一次load()
方法?传入的model
在哪里使用的?
为什么必须至少调用一次load()
方法?
其实不用看代码,想象都明白,你不传入资源文件,Glide为我们加载什么东西?
如上图,源码注释中也说道了,不过就算你不调用load()
方法也不会出问题,因为isModelSet参数就是用来判断是否调用了load()
方法,Glide已经帮我们处理好了。
如图:
所以保证了不会crash。
传入的model
在哪里使用的?
传入的model会在最后的into()
方法中去使用,
public <Y extends Target<TranscodeType>> Y into(@NonNull Y target) { ... Request request = buildRequest(target); ...}private Request buildRequest(Target<TranscodeType> target) { return buildRequestRecursive(target, null, transitionOptions, requestOptions.getPriority(), requestOptions.getOverrideWidth(), requestOptions.getOverrideHeight()); }private Request buildRequestRecursive(Target<TranscodeType> target, @Nullable ThumbnailRequestCoordinator parentCoordinator, TransitionOptions<?, ? super TranscodeType> transitionOptions, Priority priority, int overrideWidth, int overrideHeight) { ... Request fullRequest = obtainRequest(target, requestOptions, coordinator, transitionOptions, priority, overrideWidth, overrideHeight); RequestOptions thumbnailOptions = requestOptions.clone() .sizeMultiplier(thumbSizeMultiplier); Request thumbnailRequest = obtainRequest(target, thumbnailOptions, coordinator, transitionOptions, getThumbnailPriority(priority), overrideWidth, overrideHeight); ...}private Request obtainRequest(Target<TranscodeType> target, RequestOptions requestOptions, RequestCoordinator requestCoordinator, TransitionOptions<?, ? super TranscodeType> transitionOptions, Priority priority, int overrideWidth, int overrideHeight) { requestOptions.lock(); return SingleRequest.obtain( context, model, transcodeClass, requestOptions, overrideWidth, overrideHeight, priority, target, requestListener, requestCoordinator, context.getEngine(), transitionOptions.getTransitionFactory()); }
以上部分代码已经精简过来,关于into()
方法本章先不介绍,下一篇将详细介绍。
到这里 .load()
方法已经基本结束了。
这里只介绍了load(@Nullable Object model)
,总共有七个,原理都是一样的,这里就不挨着介绍了。
好了 .load()
,还是比较简单的,下一篇会继续我们的三步走,讲解.into()
方法。
扫码关注公众号“伟大程序猿的诞生“,更多干货等着你~
扫码关注公众号“伟大程序猿的诞生“,更多干货等着你~
扫码关注公众号“伟大程序猿的诞生“,更多干货等着你~
- Glide4.0源码全解析(二),load()背后的故事
- Glide4.0源码全解析(一),GlideAPP和.with()方法背后的故事
- Glide4.0源码全解析(三),into()方法背后的故事
- Android 图片加载框架Glide4.0源码完全解析(二)
- Android 图片加载框架Glide4.0源码完全解析(一)
- Glide4.0的基本用法
- Glide4.0+使用的坑
- 全连接层解析(二)——源码解析
- JUnit4执行cases背后的故事(1)---JUnitCore源码分析
- Mac OS X 背后的故事(二)——Linus Torvalds的短视
- Mac OS X 背后的故事(二)——Linus Torvalds的短视
- 网络蚂蚁背后的故事(转)
- 常见词汇背后的故事(1)
- 常见词汇背后的故事(2)
- 常见词汇背后的故事(3)
- 常见词汇背后的故事(4)
- 常见词汇背后的故事(5)
- 常见词汇背后的故事(6)
- java注册时向指定邮箱发送邮件激活
- Error Domain=NSURLErrorDomain Code=-1007 "太多 HTTP 重定向" UserInfo={NSUnderlyingError=0x170247230 {Erro
- C++之函数模板
- Android移动端车牌识别demo
- 从零开始微信机器人(一):wxpy简介(登录、消息发送、注册回复)
- Glide4.0源码全解析(二),load()背后的故事
- EasyUI动态表头与数据宽度不对应
- Java语言基础学习笔记(二)
- Java命名规范—动力节点Java学院整理
- kinect2.0 opencv3.2深度图像提取(方式一)
- 设计模式——装饰者模式
- JS是一门什么样的语言
- JSP--(Jsp基本语法)
- (Python)矩阵转化