深入理解篇之 OkHttp
一. 概述
OkHttp 是 http 协议的网络工具包,其提供了以下特性:
支持 http/2 协议
允许共享同一个 socket
支持 gzip 压缩
增加缓存机制
增加连接池
二. 关键流程
2.1 职责链处理
2.2 连接处理
2.3 网络交互处理
三. 特性解读
3.1 缓存机制
OkHttp 提供的缓存特性,其主要的代码在 CacheInterceptor 来实现,具体查阅《OKHttp解析之缓存机制CacheInterceptor》。这一块没有过多了解,待后续回顾再看其逻辑。
3.2 连接池
这里的连接池与我们常规理解的连接池不一样。其主要的逻辑代码在 ConnectionPool。其并没有对连接数量进行管理,而是为了减少三次握手而复用现有的连接。可以查阅《ConnectionPool连接池》、以及《
连接池复用机制》。
简单来说,ConnectionPool 主要做的动作如下:
记录已创建的链接对象,为了复用,共享一个连接,减少三次握手,提高响应速度。
衍生出对连接的管理,定时清理不活跃的连接
3.3 Http2 协议
主要的逻辑在 Http2Codec 类中,目前没有使用的场景,待后续可以再补充。
3.4 gzip 压缩
其再 Source 以及 Sink 接口的实现类来处理,其具体的实现包在 okio。对应的实现类为 GzipSource 和 GzipSink 类。其逻辑较为复杂,待后续有时间在进行介绍解读。
四. 其他
4.1 监听器
在整个网络交互中,有很多关键点需要监听,便于采集对于的一些数据或者监控等功能。关键点如下:
callStart——开始调用
dnsStart——dns 开始
dnsEnd——dns 结束
connectStart——连接前
connectEnd——连接后
secureConnectStart——安全连接前
secureConnectEnd——安全连接后
connectFailed——连接失败
connectionAcquired——获取连接
connectionReleased——连接释放
requestHeadersStart——请求头开始
requestHeadersEnd——请求头结束
requestBodyStart——请求体开始
requestBodyEnd——请求体结束
responseHeadersStart——响应头开始
responseHeadersEnd——响应头结束
responseBodyStart——响应体开始
responseBodyEnd——响应体结束
callEnd——调用结束
callFailed——调用失败
4.2 任务调度
其主要是实现异步调用场景的。具体实现交给 Dispatcher 类来实现;实现逻辑如下:
五. 总结
通过对关键的代码的阅读,对其大体的代码运行流程有了整体的认知,从而间接学习到其代码的设计思想。
版权声明: 本文为 InfoQ 作者【邱学喆】的原创文章。
原文链接:【http://xie.infoq.cn/article/0a038279a29f6b0aafa317bc3】。文章转载请联系作者。
评论