00:00
好,接下来呢,我们开始讲解,呃,讲这个源码分析啊,详细的讲解,首先呢,看一下这个代码。这个呢,是我们这个项目这个工程啊。大家看一下啊,May这里面呢,一共有两个例子啊,一个是这个get的请求,一个是破请求啊,我们把这个源码呢,运行起来看一下。运行一下。好啊,就运行,运行起来之后呢,就是这个效果啊,我们点击这个get请求,哎,就会从网络中啊拿到我们想要的这个数据啊,那么我把它清空,最后呢,我用这个post方式啊获取这个数据啊,一样是可以获取到这个数据的啊。好,接下来呢,我们看一下这个源代码啊,是非常非常简单的,首先第一步我们创建了这一个OK啊第一步。
01:10
一创建对okhttp client。对象,哎,创建这个对象之后啊,接下来干什么呢?来到这个这里面。那我下走吧。找到这个地方啊,Get方式进行网络数据请求,这里面首先呢,你是通过这个request啊,Builder获取一个request啊,拿到这个请求,拿到请求之后呢,又将这个请求哎,传给了这个client,这个new car。啊,这个方法中传进去之后呢,调用这个执行的方法,就能拿到你想要的这个返回值啊,这个返回值呢啊,你可以将它变成实例啊,进行进一步的处理啊,其实非常简单,就三步啊,准确的说下面第一步创建这个对象啊,第二步干什么呢?
02:07
创建这个请求啊,创建请求第三步,将这个请求传入到这个new这个方法中,哎,就能拿到你想要的返回值啊,就这么简单,那好,呃,前面。这个okp啊,我们看一下这个对象,这个对象里面有什么信息啊,这里面有哪些信息呢?啊,包括这个dispat啊分发器,还有呢这个啊池子啊线程池,还有这个连接。啊,这里面有一个这个截获器啊,截获器,还有一个是网络截获器啊,记住啊,一个截获器,一个网络结构器啊,其实这个呢,是这个应用层的这个结构器啊,这两个啊概念比较重要,再往下呢。再往下找。呃,再往下找呢,包括这个连接池啊,还有这个连接时间啊,读取时间啊,还有这个写的时间这些等等啊,这些都不是特别重要的啊,重要的就这几个是这个分发器啊,持着还有这个应用层结构器和网络层结构器,这对象知道它有这些东西就可以了,好之后呢,我们退回来。
03:23
退回来之后啊,看一下它第二个。第二个呢,就是创建这么一个request啊,这个没啥说的,之后呢,就来到这个地方啊,将这个request传入到这个new里啊,同时别忘了这后面有一个啊Q,这个方法啊,这个方法呢,是这个同步的执行方法啊,正常的还有一个异步的执行方法啊,这里面我用这个同步为例啊,好,记住将它传进来啊,将这个request传进来之后,它立刻就又又创建了这么一个call啊,是什么扣呢?是real扣。
04:00
啊,将这个请求传进来,传进来之后那就调用它呗,调用它啊,这是一个构造,那么还记得。这个构造中调的哪个方法吗?来是不是调的它呀,哎调的它SQ。同样我们找到它的SQ的方法,这里边呢,这个是同步的方法啊,还有一个异步的方法,异步的方法呢,是在这儿啊,它俩大同小异,最终的啊,执行的方法还是回到一致的啊好,那么我们往下走啊,往下走走到这个地方。这是什么呢?调用了一个分发器啊,把这个请求添加到这个分发器中,这分发器是谁呢?也就是你这个应用层啊,这个模块分发器啊,之前说过它。好,那么这个分发器他干了什么事情呢?将你这个request啊,就传入到你这个正在运行的同步的call中啊,就进行这个事情,将这个request传给他,这就是一个request,这个一个队列啊队列好,那我们我们退回来,这是把这个请求给这个分发器给他之后啊,并没有完啊接下来干什么呢。
05:22
截获器处理啊,截获器通这个名字大家能感觉到什么意思吗?拦截啊,就是先把你拦截了之后啊,我给你进行进一步的包装啊,再返回结果啊,就这个意思,那我们来详细的看一下里面这个做的事情。这里面呢,创建了是一个应用层的接获器啊,New一个application应用层intercept啊接获器好,那么创建完之后呢,就得到了这么一个结构器对象啊,这个对象呢,最后呢,调用了这个process的这个方法啊,那好我们先看一下这个应用层这个结合器。
06:02
进来其实呢,也就是这个方法啊,这个类啊,这个类,那这个类呢,它返回一个对象,这个对象最终调用的是processed,也就是你这里面调用的process是哪个方法呢。就是这个方法啊,就是这个方法,因为它返回来是这么一个对象,这个对象呢,最终调用的啊,好来到这来到这之后。这些就是对这个截获器进行处理啊,结合器,那么看一下这结构器干嘛的,先判断是否每个结获器都有对应的处理,没有的话先继续创建application啊,你看这下面这是不是又一个application intercept啊,它是谁呢?它是不是还是当前这个类啊,哎,它又创建了一个啊在这里面呢,不断的这个迭代啊迭代。啊,并执行当前这个截获器的intercept方法啊,拦截器可以用来转换重试啊,重写请求机制等等啊什么意思呢,比如说。
07:09
我这个请求原来的这个请求头啊,比如说十个字节,那么我这个结构器拦截给他拦截到啊,诶小的别走,我再给你加这么两个字节啊进去,那么之后它是就变成12字节了,哎,就把你这个信息就篡改了啊,还有比如说你这个原来这个编码是这个GBK,哎,我给你拦截之后,我可以把你这个编码方式改为这个UTF杠八。啊,是不是啊,这样非常好啊,啊为什么这样是呢?大家有没有想到,如果你把所有的事情都在这个,你这个OK,原码底层啊都做好了之后。啊,那你是不是这个逻辑非常复杂呀?啊,那么要是不做好通过这个结合器的方式。哎,我想要怎么改,我就给你加这么一个结构器,那么是不是这个可扩展性可维护性更好一点呢?啊,那么这个结构器具体怎么用,哎之前呢,我这有个例子。
08:03
就是在这个may中啊,在这个位置测试添加结构器这里面啊,调用这个方法之后呢,这个client这个也就是OK的这个对象啊,这里面有一个I的intercept,也就是添加解获器啊,然后呢,就会拿到这个结获器这个对象,这个结合器对象呢,这里面你有一个builder,然后艾了一个请求头,将这个头中啊添加了这么一个以K。啊是test value为test value啊这么一个头啊,添加进来了,添加完事之后,它又调用了这个process的方法。这里面调用的是application应用成的结构器啊,又来到这啊,所以说呢,这里面它是不断的便利,看你有多少个结构器啊,你有一个我就处理一个,有一个处理一个啊,不断的这个循环,这个便利啊递归。
09:01
最终把你所有的结构器都给你处理完啊,你可以同时这个处理这个修改编码啊,可以这个修改这个。请求头的长度啊,等等一些信息修改完事之后再给你返回啊,这是这个结合器的作用啊,好,这个截获器处理完之后。啊,就来到真正的去发送请求,处理请求啊,也就是什么呢,也就是说你上面。这一部分信息已经处理完了,接下来该处理这个。啊,逻辑层这一层的业务也就是发送请求读取应答啊发送取应答,好,那么来详细看一下。进来。进来之后呢,它是先获取了一个请求体啊,请求体之后呢,在这下面啊,经过一系列的啊添加,主要是处理它的啊头啊添加一些头。这里面呢,我们不做进一步的详细讲解啊,往下走,走到这个地方。
10:04
这个地方呢,它创建了一个http engine干什么呢,这个engine。哎,还记得这个吗?哎,Engine引擎啊,就是它这个中间这个层,那么创建了它之后,接下来又干什么了呢?往下走,走到这。首先呢,就是发送这个请求,调用这个send request。那我们看一下。进来send request,这个send request干什么了呢?首先对这个网络请求再次的更改。看一下它这里面呢,又对这个头啊,进行了进一步的这个修改啊,这里面呢,我们先不做处理啊,返回。返回之后啊,来到这个地方获取用户设置的啊缓存,也就是说什么呢?你这个发送请求啊,啊发送完之后,我先从这个缓存中去拿数据,如果你返回的这个re response这个缓存。
11:07
嗯,它不为空,那么我就直接从你这个缓存中去拿起我想要的数据。啊,这就是从缓存中读取之前相同请求得到的response。啊,这个意思,那你是不是要从缓存中拿数据,是不是比正常去请求网络拿的数据快呀,哎,就这个意思,有缓存,它这个缓存呢,跟我们正常那个3D缓存还不太一样,它这有这个时间限制啊,有个时间策略,我们可以进来看一下,它是不是获取了当前这个系统时间呢?啊,进来。那么也是他,他呢,之后呢,就传给了他。那么传给他,我们可以查找一下。啊,这个地方啊,他呢,减去了这一个response啊,接收请求的这一个时间之后呢,就给了一个他。
12:02
它这里啊,又进行了啊,很多详细的这个复杂啊,复杂的处理,也就是这个case response is啊这里面呢,不对大家进行展开处理啊,但是。返回来啊,这个策略是什么,什么用处呢?它是先从你的缓存数据去拿啊,但是如果你这个缓存的数据超时了,这也就是你传这个时间的原因啊,如果超时了,那么我就。啊,也从你的缓存中心拿数据,但是啊,我还会进一步的再次请求网络啊,把这个数据拿回来。如果这个数据呢,没有超时,那么我就不再去请求网络了啊,这个地方有点区别,你是什么意思,我再详细说一遍,如果你这个数据啊,过期了,这么直白一点啊,过期了呢,那么我也把你的缓存数据拿过来进行显示。但是。我要求我再去请求一次服务器啊,把这个数据拿过来之后我更新,如果这个数据没有过期。
13:04
那么我就拿过来直接用了啊,就是缓存的数据啊,这个是啊,跟普通的这个请求有点区别啊,大家记一下好再往下啊,缓存完之后。往下走。走到哪儿了?走到这儿。建立连接啊,建立连接进来。进入到这个建立连接之后,这底层创建这个流资源啊,那么创建流资源是不是也就来到了。你这个底层啊,啊,就来到这个底层流啊,流的一个相关信息啊。那么来到这个流之后呢,这里面创建了一个啊,创建创建之后往下找啊找这找什么呢?Find healthy connection,查找到良好的连接啊,也就是找到一个好的连接,那进来。进来之后呢,再往下找,从线程池中去查找好的连接。
14:05
在早。进来。那么进来之后往下走,走到哪儿呢?这个地方。通过这个叫什么连接池啊,通过连接池中去查找有没有这个池啊,线程的连接,如果有那么就直接return返回啊,如果没有,没有怎么办?路径选择器啊,Root select这个呢,也就是这里面这一个的核心模块啊root选择器。好。那么选择器如果选不到,那么它就是不断的在寻找啊,不断的在,如果实在找不到,那怎么办呢?哎,再往下,如果实在这个连接时没有可用的。那么就创建新的连接池,又一个real connection创建,创建完了之后,别忘了再将这个连接新的连接池啊,连接存放到这个连接池中,那么下次再找的时候就能找到了啊这个意思啊,之后呢,就是建立连接,那我们看一下建立连接。
15:17
走到这儿。那这个呢,往下找啊,找到哪呢?这这是build connection,也就是真正的去建立连接好进来,进来了之后呢,是连接socket connect socket。链接啊,你要连接socket,那首先获取的是啊这个路径的地址啊,拿到这个地址之后就可以进行进一步的这个操作啊,下面呢,就是具体的这连接这个socket啊,然后拿到这个source读数据端也是呢,拿到这个S呢是写数据端,Socket两端一个是读,一个是写啊这也同时也说明了这个o OK gtp底层封装的是socket啊,封装的socket。
16:04
好,相信大家走到这儿啊,是不是已经欠套子运了,那么我们回顾一下啊,再详细的讲解一下。再给大家讲说一遍,还是首先呢,从你这个啊。传进一个request啊,然后呢,调入这个new这个方法,然后呢,这里面执行real call。将这个request传进来,记住啊,传进来之后呢,Real它调用的是ex执行的方法,也就是。这个方法啊,给这个方法。好,那么过来之后呢,我们就来到这个地方啊,这个应用层有两个事情要做,一个是将这个请求,也就是这个request this嘛,啊传入到这个。正在运行的啊,同步的courses啊,这个队列中传进去,传进去之后进行统一的分发啊,然后呢,这里面正常就结束了,但是这里面加了这么一个拦截器啊,也就是截获器,将这个消息啊进一步的拦截,拦截处理,最终呢,电脑插方这个方法。
17:19
我们找一下。截获你每一个添加的这个结构器啊,你是改变这个编码啊,还是这个改变这个数请求头长度啊,还是改变一些核心的信息啊啊等等一些操作都可以在这里面去修改啊,最后呢,就来到这个啊,发送请求啊,发送请求具体在什么位置呢?在这个位置啊。在这个位置之前,需要创建这么一个and啊,中间层这么一个and类and对象,那么and呢,发送这个请求。好,发送请求,发送请求这里面。
18:00
首先是得到这个请求啊,对这个请求进一步的这个封装啊。好,那退回来之后。这一大块啊,都是它缓存策略的这一个处理啊,缓存的处理啊,也就是呢,我先从你这个缓存中去拿数据啊,如果能拿到,那么我就直接啊返回拿到你这个缓存数据,但是这个缓存数据呢,还有一个特殊的加了一个时间,如果你这个数据显示已经过期了,那么我还要再次的去请求服务器,如果没有过期,那么我就正常用了啊,这个地方要注意一下。那再往下,再往下呢,其实就来到了这个真正的去底层去建立连接啊,这个地方嵌套的比较长啊,首先呢,是创建这么一个流资源啊,然后呢,接下来就是查找到一个好的连接,那怎么查找呢?往下找啊往下找在线程池中去查找啊,节省这个开销。进来进来之后呢,首先它还是。
19:02
从这个连接池中去获取这个有用的连接,如果连接池中没有,那么我就通过这个啊,路径选择器啊,Root letter去寻找下一个啊,不断的寻找下一个,直到查到为止,如果入境选择器都没有查到,那么他就自己去创建这么一个连接。啊好,那么创建这个连接呢,别忘了再添加到这个连接池中啊,方便下一次使用之后呢,去真正的去建立这个连接啊,建立这个连接往下走。啊,其实呢,底层就是这么一个shocked啊,Shocked这里面有一个读端short和一个写端think啊后面我们会用。这样呢,就是把这个发送请求啊,这个整整的一大步,也就是到哪呢。回来。
20:01
通过查找吧。进进。进来进来之后呢,走到这儿,嗯,这个呢是应用层的结构器,然后往下找这个地方。最后呢,就来到这个地方啊,这个地方就是发送请求啊,这个过程啊就已经结束了啊,那我们把这个啊流程给大家说一下。这。这里面有一个啊构造request请求,Request这里面呢,实验是这个请求方式,包括这个同步和异步啊里面呢,我们以这个同步为例啊,同步为例,这里面首先呢,是将这个同步消息啊放入到这个拍中啊,也是这个地方。
21:00
这个地方啊,将这个请求放入到这个分发器中,接下来呢,就是处理这个结构器。啊,发送这个请求这里面呢,啊,对这个网络连接啊,这个是底层的这个网络连接啊,这个嵌套的还是很深的啊,最后呢,是读取这个response结果啊。这是比较核心的步骤啊,都在这儿了。
我来说两句