2.24 okhttp源码解析

less than 1 minute read

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架构图【引用自OkHttp 3.7源码分析, https://yq.aliyun.com/articles/78105】

以下则是按照个人理解梳理, 参考OkHttp 3.7源码分析的图也挺清晰

  1. 接口层, 包含OkHttpClient, Call
  2. 任务管理和执行, Dispatcher
  3. 处理Http层的InterceptorChain, 包含重试, 缓存, 链接, IO读写等
  4. 横向的HTTP能力, 包含Cache, 使用DiskLruCache; Http链接层, StreamAllocation等, 以及IO层HttoCodec

2.22.3 okhttp流程

  1. Call(RealCall)#execute()
  2. Dispatcher#executed(), ExecutorService维护线程池以及同步和异步Call执行队列
  3. 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清除重复的多路复用线程

2.22.3 参考