目录
- 源码查看
- 解析
- 任务调度
- 拦截器
- 缓存策略
- 断线重连
- 流程图
- 总结
1 打开Source Insight 4.0(源码查看器)
最开始的方法肯定是从它开始的
OkHttpClien.newCall(request);
如果不会下载工具和源码
可以查看Android View加载过程——准备荧光棒
这是源码查看方法
2 请求开始解析
返回的是Call,那么往下看看Call
再使用OkHttp的时候要调用call.enqueue()方法,里面new Callback()还要实现它的两个方法这些先不看
call.enqueue()
我们看Call中enqueue方法是如何编写
原来是getDispatcher()方法
这个没啥好说
3 任务调度
Dispatcher类,我也不知道定义了啥,我猜一下
第一个是最大并发请求数
第二个是请求每个主机的最大请求数
第三个是消费者线程池
第四个是将要运行的,我们叫它缓存队列
第五个是正在运行的异步队列
第六个是同步
再看它的构造方法
我们在看看Dispatcher的enqueue方法
一这个方法是锁起来,异步重复调用是,没用的
二看到条件没,当正在运行的异步请求队列中的数量小于64并且正在运行的请求主机数小于5时,把请求队列加载到异步运行队列,否则添加到异步缓存队列
我们在看看消费者线程池中AsyncCall的execute方法
异常是否发生,都会调用Dispatcher的finished()方法
我们在看看promoteCalls()方法
最关键的是每次请求之后都会进行finished方法中的promoteCalls方法,从readyAsyncCalls取出下一个请求,加入到runningAsyncCalls中,并由线程池处理
4 拦截器
回过头来从我们的getResponseWithInterceptorChain()方法查看它是啥东西
我们找到我们的OkHttpChain中的这个方法
这个chain是啥是一个
Call的内部类
我们找到它
这个getResponse方法等下在讲
我们先看看上面的Interceptor是个拦截器。
OkHttp中Interceptor的使用
5 缓存策略
我们再看看getResponse方法
先查看HttpEngine的sendRequest方法
cacheCandidate是上次与服务器交互时缓存的Response,
这里的缓存是Map,key是请求中url的md5,value是在文件中查询到的缓存。
第一张情况是networkRequest网络请求和cacheResponse缓存的响应都为空的情况下。
第二种是networkRequest为null时不进行网络请求,如果缓存可以使用则直接返回缓存
其它情况请求网络。
在看看HttpEngine的readResponse方法,当然前面还有代码,就不列举出来了
这个方法主要是用来解析HTTP响应报头,如果有缓存并且可用,则用缓存的数据并更新缓存,否则就用网络请求返回数据。
我们看validate方法
第一种如果服务器返回的code是304,则缓存有效。
第二种通过缓存和网络请求响应中的Last-Modified来计算是否是最新数据。如果是,则缓存有效。
如果不是的话就返回false,清理之前的缓存。
6 失败重连
最后我们再回到RealCall的getRespons方法。
再这个两个异常情况下都会调用HttpEngine的recover方法
代码如下:
重连是通过最后一个方法去完成的。
7 请求流程图
8 总结
之前有讲过复用连接池,okhttp当然也有,我就不讲解了,这篇笔记分享给大家。希望大家能了解它的请求过程,什么是任务调度,拦截器的作用,缓存策略,如何重连。
图侵联删,下次见。