写点什么

深入理解篇之 OkHttp

作者:邱学喆
  • 2022-11-12
    广东
  • 本文字数:892 字

    阅读完需:约 3 分钟

深入理解篇之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 类来实现;实现逻辑如下:

五. 总结

通过对关键的代码的阅读,对其大体的代码运行流程有了整体的认知,从而间接学习到其代码的设计思想。

发布于: 刚刚阅读数: 3
用户头像

邱学喆

关注

签约作者;计算机原理的深度解读,源码分析 2018-08-26 加入

在IT领域keep Learning。要知其然,也要知其所以然。原理的爱好,源码的阅读。输出我对原理以及源码解读的理解。个人的仓库:https://gitee.com/Michael_Chan

评论

发布
暂无评论
深入理解篇之OkHttp_任务调度_邱学喆_InfoQ写作社区