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

文章目录

  • 一、前言
  • 二、源码分析
    • 1、load()


Android Glide图片加载框架系列文章

Android Glide图片加载框架(一)基本用法

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

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

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

Android Glide图片加载框架(三)缓存机制


一、前言


在源码分析系列文章中,上一篇我们分析了 Glide.with() 方法的用法及作用,它传递了我们的上下文对象,并且返回绑定了对应生命周期的RequestManager对象,还没有看过上一篇文章的朋友,建议先去阅读 Android Glide图片加载框架(二)源码解析之with()。


下面我们来详细分析 load() 方法的源码。


二、源码分析


1、load()


我们先来回顾下,平时在使用load方法的时候,可以传入很多不同的参数,例如:

在这里插入图片描述

Glide.with(this).load(R.drawable.ic_android).into(imageView);
Glide.with(this).load("http://xxx.xxx.png").into(imageView);
Glide.with(this).load(Uri.parse("xxxxx")).into(imageView);
Glide.with(this).load(getResources().getDrawable(R.drawable.ic_android)).into(imageView);
Glide.with(this).load(new File("xxx")).into(imageView);
Glide.with(this).load(BitmapFactory.decodeFile("xxx")).into(imageView);

从上述代码中我们可以看到有很多个 load() 方法的重载,支持了多种形式的图片资源,包括 本地图片应用资源网络图片二进制流Uri对象 等,使用起来很方便,不用再自己写一堆请求网络或者读取本地文件的骚操作,那么Glide的load()里面对它们做了什么处理,能够兼容这么多形式的加载呢,让我们一探究竟。

上一篇我们分析了 with() 方法的源码,由于 with() 方法返回的是一个 RequestManager 对象,那么很容易就能想到,load() 方法是在 RequestManager 类当中的,所以说我们首先要看的就是 RequestManager 这个类。

RequestManager 类的简化代码(我们以load(String);为例)如下所示:

public class RequestManager implements LifecycleListener,ModelTypes<RequestBuilder<Drawable>> {...@NonNull@CheckResult@Overridepublic RequestBuilder<Drawable> load(@Nullable String string) {return asDrawable().load(string);}@NonNull@CheckResultpublic RequestBuilder<Drawable> asDrawable() {return as(Drawable.class);}@NonNull@CheckResultpublic <ResourceType> RequestBuilder<ResourceType> as(@NonNull Class<ResourceType> resourceClass) {return new RequestBuilder<>(glide, this, resourceClass, context);}...
}

RequestManager 类的代码是非常多的,但是经过我这样简化之后,看上去就比较清爽了。在我们只探究加载图片URL字符串这一个load()方法的情况下,那么比较重要的方法就只剩下上述代码中的这三个方法。

那么我们先来看 load() 方法,这个方法中的逻辑是非常简单的,只有一行代码,就是先调用了 asDrawable() 方法,而 asDrawable() 方法也极为简单,就是调用了 as() 方法,并且指定参数为 Drawable.class ,as()方法中初始化了一个 RequestBuilder 对象,然后调用 RequestBuilder对象的load() 方法。

细心的朋友会发现,Glide不止有 asDrawable() ,其实还有 asBitmap()asGif()asFile() 等等,如下:

在这里插入图片描述

public class RequestManager implements LifecycleListener,ModelTypes<RequestBuilder<Drawable>> {...public RequestBuilder<Bitmap> asBitmap() {return as(Bitmap.class).apply(DECODE_TYPE_BITMAP);}public RequestBuilder<GifDrawable> asGif() {return as(GifDrawable.class).apply(DECODE_TYPE_GIF);}public RequestBuilder<File> asFile() {return as(File.class).apply(skipMemoryCacheOf(true));}public <ResourceType> RequestBuilder<ResourceType> as(@NonNull Class<ResourceType> resourceClass) {return new RequestBuilder<>(glide, this, resourceClass, context);}...
}

由此我们可以发现,Glide默认使用的是 asDrawable() ,不管是还有 asBitmap()asGif() 还是 asFile() 最终都调用 as() 方法返回 RequestBuilder 对象实例。

RequestBuilder类的简化代码如下所示:

public class RequestBuilder<TranscodeType> implements Cloneable,ModelTypes<RequestBuilder<TranscodeType>> {protected RequestBuilder(Glide glide, RequestManager requestManager,Class<TranscodeType> transcodeClass, Context context) {this.glide = glide;this.requestManager = requestManager;this.transcodeClass = transcodeClass;this.defaultRequestOptions = requestManager.getDefaultRequestOptions();this.context = context;this.transitionOptions = requestManager.getDefaultTransitionOptions(transcodeClass);this.requestOptions = defaultRequestOptions;this.glideContext = glide.getGlideContext();}@NonNull@Override@CheckResultpublic RequestBuilder<TranscodeType> load(@Nullable String string) {return loadGeneric(string);}@NonNullprivate RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) {this.model = model;isModelSet = true;return this;}
}

RequestBuilder 的构造方法中我们可以看到,这里的 transcodeClass 就是我们刚传进来的Drawable类型,成为了 RequestBuilder 的成员变量。RequestBuilder对象实例化后,调用RequestBuilder的 load() 方法,load()方法内部都是调用了 loadGeneric() ,这里的 model 即传进来的资源参数(例如String、Bitmap、File…),同样赋给RequestBuilder的成员变量,并且置 isModelSet 标志位为true,即标志着设置完成的意思,并且将这个RequestBuilder实例返回。

至此我们得到了关于 RequestBuilder参数 的一些信息:

  • transcodeClass: 表示要将最终结果转换为什么类型;

  • model: 表示传进来的资源参数;

  • isModelSet: 是为了标志你已经调用了load方法,是一个必要条件,否则你没有先设置你所要加载的资源,Glide怎么知道你要加载啥。

至此,Glide的 load() 完成了它的使命,是不是有种被欺骗的感觉,load()方法其实还没真正开始加载,into()才是最终加载的地方




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

codeforces 231A-C语言解题报告

231A题目网址 题目解析 1.输入比赛的题目,每一道题3个人的解题状况(0或1),输出总的解答题目(每一个题至少有2个,记1次) 2.在for循环中去录入每道题的解答状况 3.因为有题目解答的计算,所以直接用原始的解答状况去计算 if(result[0]result[1]result[2]3) { count; } 知识点 …

英语一段落排序题技巧

总述 1.做此题不用通篇理解,找第一句和最后一句,理清楚里面的逻辑即可 首段 1.使用特殊疑问句提出问题,符合首段特点 连贯词 1.in one case…in another case 两个段落连在一起 2.some…others 隐式:most sites等同于others 逻辑 1.总分关系 调查–地面调查

计算机操作系统读者和写者模型的简单介绍以及思考

读者和写者 读写两组进程&#xff0c;共享一个文件&#xff0c;多个读者可以同时访问文件&#xff0c;多个写者不可以同时访问文件&#xff0c;写者和读者也不可以同时访问文件共享读&#xff1b;独占写特征:1,资源被谁占有&#xff1b;2&#xff0c;写者改变资源&#xff0c;…

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

文章目录一、前言二、源码解析1、into(ImageView)2、GlideContext.buildImageViewTarget()3、RequestBuilder.into(Target,RequestListener,RequestOptions);4、RequestBuilder.buildRequest()5、SingleRequest.obtain()6、isEquivalentTo()、isSkipMemoryCacheWithCompletePre…

codeforces 158A-C语言解题报告

158A题目网址 题目解析 1.输入n个选手,和第k个参考选手 再输入每一个选手的比赛成绩 2.输出比赛成绩>第k个选手的入选人数 3.n,k都是从1开始计算的 4.因为要比较所有的选手与第k个选手,所以使用数组,而且要使用两个循环(第一个输入数据,第二个比较成绩) 5.不要忘记scanf都…

通过字符串的方式读取文件的内容

代码 std::ifstream file("1.txt");std::stringstream data;data << file.rdbuf();printf(data.str().c_str());file.close(); 头文件 #include <cstdio> #include <cstdlib> #include <fstream> #include <sstream>

2014年考研英语一翻译知识点

题目讲解网址 总结 1.做翻译题,不用看句子前后的地方,直接看要翻译的部分 2.多根据语境去翻译 3.如果是不认识的单词,一般都是我们平常经常使用/说的词的代替高级词 题目句子 It is also the reason why when we try to describe music with words, all wecan do is articul…

Android Glide图片加载框架(三)缓存机制

文章目录一、缓存简介二、缓存用法内存缓存方式磁盘缓存方式三、缓存KEY四、内存缓存内存缓存流程五、磁盘缓存磁盘缓存流程Android Glide图片加载框架系列文章 Android Glide图片加载框架&#xff08;一&#xff09;基本用法 Android Glide图片加载框架&#xff08;二&#…

计算机操作系统 死锁问题

概念 条件是基础&#xff0c;在一定的原因下&#xff0c;产生结果死锁三胞胎 死锁 僵持&#xff0c;消耗时间&#xff0c;双方都占用了部分资源&#xff0c;不释放活锁 双方互相谦让&#xff0c;都不占用资源饥饿 谦让的一方一直等待&#xff0c;无法占有资源&#xff0c;导致…

C++ 力扣剑指Offer16-数值的整数次方

题目详情 /* * 实现函数double Power(double base, int exponent)&#xff0c; * 求base的exponent次方。不得使用库函数&#xff0c;同时不需要考虑大数问题。示例 1: 输入: 2.00000, 10 输出: 1024.00000示例 2: 输入: 2.10000, 3 输出: 9.26100 * 示例 3: 输入: 2.00000, -…

Android Glide图片加载框架(四)回调与监听

文章目录Android Glide图片加载框架系列文章 Android Glide图片加载框架&#xff08;一&#xff09;基本用法 Android Glide图片加载框架&#xff08;二&#xff09;源码解析之with() Android Glide图片加载框架&#xff08;二&#xff09;源码解析之load() Android Glide图…

算法章节 数组、链表、栈、队列

数组 概念与特性 1&#xff0c;数组是线性表&#xff0c;用一组连续的内存空间存储⼀组具有相同类型的数据 2&#xff0c;最大的特性是⽀持按照下标O(1)时间复杂度内快速访问数组元素 3&#xff0c;⼀维数组寻址公式&#xff1a;a[i]_addr base_addr i * data_type_size 操作…

武忠祥.高等数学.基础课-第一章函数 极限 连续P10

sin(1/x) 详细解析网址 1.图像 2.极限 x–>0时,函数极限不存在 sin2x 详细作图网址 1.图像 2.周期为Π f(x)周期为T,f(axb)周期为T/|a| 所以sinx周期为2Π,sin2x周期为2Π/2Π |sinx| 详细讲解网址 1.图像 2.周期:Π 3.绝对值 &#xff08;1&#xff09;y|sinx|的图…

Java命令:jstat — 查看JVM的GC信息

文章目录一、简介二、常用命令1、jstat -class pid : class loader行为统计2、jstat -compiler pid : JIT编译器行为统计3、jstat -gc pid 5000 20 : 垃圾回收堆行为统计4、jstat -gccapacity pid 5000 20 : 堆内存统计5、jstat -gcutil pid 5000 20 : 总结垃圾回收统计6、jsta…

算法章节 递归、排序、⼆分查找

递归 概念与特性函数调⽤函数⾃身的编程⽅式叫做递归&#xff0c;调⽤为”递“&#xff0c;返回为”归“三个条件1. ⼀个问题的解可以分解为多个⼦问题的解&#xff1b; 2. 分解之后的⼦问题&#xff0c;除了数据规模不同&#xff0c;求解思路跟原问题相同&#xff1b; 3. 存在…

codeforces 50A-C语言解题报告

50A题目网址 解题报告-others 题目解析 1.输入n x m大小的木板,使用21大小的多米诺去填满,求最多的多米诺数目 2.通过分析把木板分为奇数和偶数的情况 1)有一边是偶数的情况: 使用2去填满 2)两个边都是奇数 奇数-1偶数 还是让木板的(奇数-1)边去和2平行,再加上 (m-1)/2(n/1)…

Java命令:jps — 查看进程信息

文章目录一、简介二、常用命令1、jps2、jps -l3、jps -q4、jps -m5、jps -v6、jps失效一、简介 JVM Process Status Tool&#xff0c;显示指定系统内所有的HotSpot虚拟机进程。 功能&#xff1a; 显示当前所有java进程pid的命令&#xff0c;我们可以通过这个命令来查看到底启…

操作系统概述 记录操作系统相关知识

操作系统 现代计算机系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口以及各种输入/输出设备构成。上面提到的这些东西都属于硬件资源&#xff0c;用户不会直接和硬件进行交互&#xff0c;计算机安装了一层软件&#xff0c;这层软件能够通过响应用户输入的…

2014年英语一作文partA

作文讲解网址 题目 Write a letter of about 100 words to the president of your university, suggesting how to improve students’ physical condition. You should include the details you think necessary. You should write neatly on the ANSWER SHEET. Do not sign…

JDK工具使用大全

文章目录一、简介一、简介 在JDK的bin目录下有很多命令行工具&#xff1a; 常用工具使用详解如下&#xff1a; Java命令&#xff1a;jps — 查看进程信息 Java命令&#xff1a;jstack — 获取线程dump信息 Java命令&#xff1a;jmap — 打印指定进程的共享对象内存映射或…