资讯动态

OkHttp 原理简析

发布时间:2026/10/29 11:06:35 来源:尧图企业网站定制
流程创建OkHttpClient和Request对象Call.Factory将 Request封装成Call时对象RealCall 为具体的 Call 实现调用Call的 execute()发送同步请求或enqueue()发送异步请求。dispatcher对请求分发RealCall.getResponseWithInterceptorChain() 中利用 Interceptor 链条分层实现缓存、透明压缩、网络 IO 等功能dispatcher发送的同步/异步请求都会在 dispatcher中管理其状态同步的话走当前线程发送请求异步的话则使用OkHttp内部的线程池进行。异步请求只是通过异步线程和callback做了一个异步调用的封装通过 Dispatcher 利用 ExecutorService 实现。最终逻辑还是会调用到execute()这个方法然后调用了getResponseWithInterceptorChain()获得请求结果。dispatcher的作用为维护请求的状态,并维护一个线程池,用于执行请求。维护了三个请求队列正在运行的异步请求、就绪的异步请求、正在运行的同步请求execute() 方法首先将当前请求标记为“已执行”然后会为重试跟踪拦截器添加堆栈追踪信息接着事件监听器记录“调用开始”事件调度器将当前对象放入“运行中”队列 之后通过拦截器发起调用并获取响应最后在 finally 块中将当前请求从“运行中”队列移除异常发生时事件监听器记录“调用失败”事件。interceptors提供了两个自定义拦截器五个内部拦截器。两个自定义拦截器应用拦截器在所有拦截器之前用于配置 OkHttpClient 对象网络拦截器在真正行动前用于配置 OkHttpClient 的网络配置。每个拦截器中的intercept方法intercept() 方法是实现 interceptor 接口时必须要实现的方法该方法持有下一个责任链 对象 chain在拦截器的实现类里只需要在 intercept() 方法里的适当地方再次调用 chain.proceed() 方法Chain 接口是 Interceptor 接口的内部接口可以看成是一个递归方法client.interceptors应用拦截器由开发者设置的拦截器会在所有的拦截器处理之前进行最早的拦截处理可用于添加一些公共参数如自定义 header、自定义 log 等等。RetryAndFollowUpInterceptor重试或重定向请求Bridgelnterceptor转化将Request请求转化为能够进行网络访问的请求将Response转化为用户可用的Response设置内容长度内容编码设置gzip压缩并在接收到内容后进行解压。省去了应用层处理数据解压的麻烦添加cookie设置其他报头如User-Agent,Host,Keep-alive等。其中Keep-Alive是实现连接复用的必要步骤CacheInterceptor主要负责缓存的相关处理将 Http 的请求结果放到到缓存中以便在下次进行相同的请求时直接从缓存中读取结果提高响应速度。在建立连接、和服务器通讯之前就是 CacheInterceptor在建立连接之前我们检查响应是否已经被缓存、缓存是否可用如果是则直接返回缓存的数据否则就进行后面的流程并在返回之前把网络的数据写入缓存。具体的缓存逻辑 OkHttp 内置封装了一个 Cache 类它利用 DiskLruCache用磁盘上的有限大小空间进行缓存按照 LRU 算法进行缓存淘汰而如果我们对 OkHttp 内置的 Cache 类不满意我们可以自行实现 InternalCache 接口在构造 OkHttpClient 时进行设置这样就可以使用我们自定义的缓存策略了。Connectlnterceptor建立同时负责了Dns解析和Socket连接包括tls连接建立连接与流对象HttpCodec RealConnection实际上建立连接就是创建了一个 HttpCodec 对象有两个实现Http1Codec 和 Http2Codec顾名思义它们分别对应 HTTP/1.1 和 HTTP/2 版本的实现。在 Http1Codec 中它利用 Okio 对 Socket 的读写操作进行封装Okio 它对 java.io 和 java.nio 进行了封装让我们更便捷高效的进行 IO 操作。找到一个可用的 RealConnection再利用 RealConnection 的输入输出BufferedSource 和 BufferedSink创建 HttpCodec 对象供后续步骤使用client.networkInterceptors网络拦截器由开发者设置的拦截器本质上和第一个拦截器类似可以在真正请求发送前做处理。CallServerInterceptor行动网络数据的请求和响应也就是实际的网络I/O操作。将请求头与请求体发送给服务器以及解析服务器返回的 response。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑