OkHttp应该了解的

目录
  1. 源码查看
  2. 解析
  3. 任务调度
  4. 拦截器
  5. 缓存策略
  6. 断线重连
  7. 流程图
  8. 总结
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当然也有,我就不讲解了,这篇笔记分享给大家。希望大家能了解它的请求过程,什么是任务调度,拦截器的作用,缓存策略,如何重连。
图侵联删,下次见。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值