OkHttp 源码解析(Kotlin版)

735 阅读1分钟

OkHttp请求示例

image.png

OkHttp的使用步骤: 1.构造个客户端; 2.构造个请求; 3.将请求与客户端建立联系生成Call对象; 4.同步或者异步请求

源码分析

构造个客户端

构造个请求

将请求与客户端建立联系生成Call对象

调用newCall返回Call对象

newCall实际上是调用RealCall返回Call对象 image.png

同步请求

image.png 最后返回getResponseWithInterceptorChain()

异步请求

image.png

同步请求和异步请求的区别:

1.同步请求调用dispatcher.executed,异步请求调用的dispatcher.enqueue

2.同步请求直接return响应结果,异步请求创建了AsyncCall实例后面通过回调来获取返回结果

dispatcher

image.png 通过源码看到Dispatcher维护了三个ArrayDeque,一个保存了正在执行的同步任务;一个保存异步正在执行的请求,另一个是异步等待执行的请求,异步右两个ArrayDeque是因为Dispatcher默认支持最大的并发请求是64个,单个Host最多执行5个并发请求,如果超过,则Call会先被放入到readyAsyncCall中,当出现空闲的线程时,再将readyAsyncCall中的线程移入到runningAsynCalls中,执行请求。

AsyncCall

AsyncCall实现了Runnable接口,最终是通过调用的是它的run()方法获取Response

image.png 通过线程池来执行

image.png 在run方法中回调getResponseWithInterceptorChain()

getResponseWithInterceptorChain()

至此,一次完整的http请求已经讲解完了,不论同步还是异步最后都调用了getResponseWithInterceptorChain()方法,下一篇文章再来讲解juejin.cn/post/700509…