OkHttp科普篇
原文作者:星宸2021 原文链接:https://juejin.cn/post/7000360176834330638
本文目的
1.梳理okhttp的整体流程 2.Java和kotlin版本的对比 (Java版本为3.14.x) 3.流程梳理都在Java版本中,kotlin作为一个对比
设备要求
OkHttp works on Android 5.0 (API level 21 ) and Java 8 . 要求在Android5.0以上的版本上且jdk版本为jdk8
使用流程
引入依赖
代码语言:javascript复制//新版库采用kotlin语言编写
implementation("com.squareup.okhttp3:okhttp:4.9.1")
发送请求
以get请求为例
- 创建一个OkhttpClient客户端对象
OkHttpClient client = new OkHttpClient();
- 执行请求
//同步请求
Response response = client.newCall(request).execute();
//异步请求
client.newCall(request).enqueue(new Callback() {
@Override
public
void
onFailure(Call call, IOException e)
{
}
@Override
public
void
onResponse(Call call, Response response)
throws IOException {
}
源码梳理(java & kotlin)
关于拦截器(Intercept)
认识拦截器
下面的拦截器顺序都是递增的
- 用户自定义拦截器:(继承Interceptor接口,实现intercept方法)
- RetryAndFollowUpInterceptor:失败重试以及重定向拦截器
- BridgeInterceterptor:桥接拦截器 (请求时,对必要的Header进行一些添加,接收响应时,移除必要的Header)
- CacheInterceptor:缓存拦截 1.根据request得到cache中缓存的response 2.确认 request判断缓存的策略,是否要使用了网络,缓存或两者都使用 3.调用下一个拦截器,决定从网络上来得到response 4.如果本地已经存在cacheResponse,那么让它和网络得到的networkResponse做比较,决定是否来更新缓存的cacheResponse 5.缓存未缓存过的response 缓存拦截器会根据请求的信息和缓存的响应的信息来判断是否存在缓存可用,如果有可以使用的缓存,那么就返回该缓存给用户,否则就继续使用责任链模式来从服务器中获取响应。当获取到响应的时候,又会把响应缓存到磁盘上面
- ConnectionInterceptor:连接拦截器 1.判断当前的连接是否可以使用:流是否已经被关闭,并且已经被限制创建新的流; 2.如果当前的连接无法使用,就从连接池中获取一个连接; 3.连接池中也没有发现可用的连接,创建一个新的连接,并进行握手,然后将其放到连接池中
- NetworkInterceptors:网络拦截器(配置OkHttpClient时设置的 NetworkInterceptors)
- CallServerInterceptor:请求拦截器(负责向服务器发送请求数据、从服务器读取响应数据)
核心
代码语言:javascript复制// Call the next interceptor in the chain.
//调用链的下一个拦截器
RealInterceptorChain next = new RealInterceptorChain(
interceptors, streamAllocation, httpCodec, connection, index 1, request); //(1)
Interceptor interceptor = interceptors.get(index); //(2)
Response response = interceptor.intercept(next); //(3)
1.实例化下一个拦截器对应的RealIterceptorChain
对象,这个对象会在传递给当前的拦截器
- 得到当前的拦截器:
interceptors
是存放拦截器的ArryList
- 调用当前拦截器的
intercept()
方法,并将下一个拦截器的RealIterceptorChain
对象传递下去 - 除了client中用户设置的
interceptor
,第一个调用的就是retryAndFollowUpInterceptor
小结
1.拦截器用了责任链设计模式
,它将请求一层一层向下传,知道有一层能够得到Response就停止向下传递
2.然后将response
向上面的拦截器传递,然后各个拦截器会对respone
进行一些处理,最后会传到RealCall
类中通过execute
来得到response
简而言之:每一个拦截器都对应一个 RealInterceptorChain ,然后每一个interceptor 再产生下一个RealInterceptorChain,直到 List 迭代完成,如下图所示
image.png
关于调度Dispatch
在开始下面的内容前,我们先简单的对Dispatcher有个认识