OkHttp

参考:彻底理解OkHttp - OkHttp 源码解析及OkHttp的设计思想arrow-up-right

用法

  1. 创建OkHttp实例,可通过OkHttpClient.Builder添加拦截器等自定配置

  2. 请求网络,可以同步/异步

    Request request = new Request.Builder().url(url).build();
    //同步
    Response response = okHttpClient.newCall(request).execute()
    response.body().string();
    
    //异步
    okHttpClient.newCall(request).enqueue();

OkHttp大致执行流程

通过OkHttpClient.newCall内部的RealCall发起网络请求(execute同步请求和enqueue异步请求,异步请求有DIspatcher进行分发),getResponseWithInterceptorChainRetryAndFollowUpInterceptors, 以及BridgeInterceptor, CacheInterceptor, ConnectInterceptor, NetworkInterceptor, CallServerInterceptor进行请求处理,最后返回请求结果,请求结束。

核心类分析

1. OkHttpClient - 配置中心

源码亮点

不可变对象设计,线程安全

深度克隆支持配置修改

默认配置优化(连接池大小、超时时间)

2. Call - 请求抽象

3. Dispatcher - 调度器

调度策略

同步请求:直接在当前线程执行

异步请求:由线程池执行,受并发数限制

主机限制:防止对单个服务器过度请求

4. Interceptor - 拦截器链


三、拦截器详细分析

1. RetryAndFollowUpInterceptor - 重试和重定向

处理场景

  • 网络异常重试(IOException)

  • HTTP 重定向(3xx 状态码)

  • 认证重试(401/407)

  • 连接超时重试

2. BridgeInterceptor - 桥接拦截器

3. CacheInterceptor - 缓存拦截器

缓存策略

强制缓存:Cache-Control: max-age, s-maxage

协商缓存:ETag, Last-Modified

启发式缓存:根据 Date, Age 等头部计算

4. ConnectInterceptor - 连接拦截器

连接建立流程

  1. 从连接池获取可用连接

  2. 如果没有可用连接,创建新连接

  3. 执行 TCP 握手和 TLS 握手

  4. 建立 HTTP/2 连接(如果支持)

5. CallServerInterceptor - 服务调用拦截器


四、连接管理

1. RealConnection - 真实连接

2. ConnectionPool - 连接池

连接池策略

默认最大空闲连接数:5

默认连接保持时间:5分钟

支持 HTTP/2 多路复用


五、HTTP/2 实现

1. Http2Connection - HTTP/2 连接

2. 头部压缩(HPACK)


六、缓存实现

1. Cache - 磁盘缓存

2. 缓存策略算法


七、设计模式应用

1. 建造者模式(Builder)

2. 工厂模式(Factory)

3. 责任链模式(Chain of Responsibility)

4. 观察者模式(Observer)

5. 享元模式(Flyweight)


八、性能优化技巧

1. 连接复用

2. DNS 优化

3. 请求体压缩

4. 超时控制


九、源码学习建议

1. 学习路径

2. 调试技巧

3. 关键断点位置

Last updated