2.24 okhttp源码解析
2.22.1 okhttp使用
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request reqest = new Request.Builder().url(url).post(bodu).build();
Reponse response = client.newCall(request).execute();
return response.body().string();
}
2.22.2 okhttp架构图
【引用自OkHttp 3.7源码分析, https://yq.aliyun.com/articles/78105】
以下则是按照个人理解梳理, 参考OkHttp 3.7源码分析的图也挺清晰
- 接口层, 包含
OkHttpClient
,Call
- 任务管理和执行,
Dispatcher
- 处理Http层的
InterceptorChain
, 包含重试, 缓存, 链接, IO读写等 - 横向的HTTP能力, 包含
Cache
, 使用DiskLruCache
; Http链接层,StreamAllocation
等, 以及IO层HttoCodec
2.22.3 okhttp流程
Call(RealCall)#execute()
Dispatcher#executed()
,ExecutorService
维护线程池以及同步和异步Call
执行队列getResponseWithInterceptorChain()
获取职责链, 执行顺序:RetryAndFollowUpInterceptor
, 失败重试和重定向, 默认最大重试次数20次 ->BridgeInterceptor
, 用户请求转成发送到服务器的请求, 以及将服务器返回转换成用户友好的响应, 增加和解析http header
->CacheInterceptor
, 缓存读写和更新, 只缓存GET
请求, 使用DiskLruCache
, LRU基于LinkedHashMap
实现 ->ConnectInterceptor
, 与服务器建立链接, 即调用StreamAllocation#newStream()
以及StreamAllocation#connection()
->OkHttpClient#networkInterceptors()
->CallServerInterceptor
, 发送请求数据, 读取服务器响应, 即调用HttpCodec
,HttpCodec
基于Okio
实现,Okio
则基于Socket
2.22.3 okhttp详解
- Http2, 主要优化报头压缩, 请求与响应复用(二进制分帧层), 指定数据流优先级, 流控制
- 连接池,
ConnectionPool
,deduplicate
清除重复的多路复用线程