网络同步请求
- Interceptor:是Okhttp最核心的一个东西,不要误以为它只负责拦截请求进行一些额外的处理(例如 cookie),实际上它把实际的网络请求、缓存、透明压缩等功能都统一了起来,每一个功能都只是一个 Interceptor,它们再连接成一个 Interceptor.Chain,环环相扣,最终圆满完成一次网络请求。
- 使用了责任链模式:主要用于Interceptor
- 它包含了一些命令对象和一系列的处理对象,每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。
- Android设计模式源码解析之责任链模式
- 建立连接:ConnectInterceptor, 发送和接收数据:CallServerInterceptor
- 在发送和接收数据中,核心工作都由Httpdoc对象来完成,而httpCodec实际上是利用的是Okio
异步网络请求
- 真正实现网络请求的是 在
getResponseWithInterceptorChain()
中,通过Interceptor链条来实现的网络请求逻辑,而异步是通过ExecutorService
实现 - 其中调用了Dispatcher,Dispatcher内部是由线程池来执行,超过最大请求数后则先加入准备请求的队列中
- 异步请求是 执行一个AsyncCall的execute方法,会调用一个叫做getResponseWithInterceptorChain的方法,并返回Response对象,然后通过接口回调的方式将此Response返回给我们在Activity中实现的Callback接口并刷新UI
- 在
getResponse
方法中创建了一个HttpEngine的对象,然后分别调用HttpEngine的sendRequest和readResponse方法,这两个方法依次是发送网络请求和读取网络请求结果,最后将Response对象返回到之前说的getResponseWithInterceptorChain方法,并回传给Activity中的Callback
缓存机制
- CacheInterceptor,在建立连接之前,我们检查响应是否已经被缓存、缓存是否可用,如果是则直接返回缓存的数据,否则就进行后面的流程,并在返回之前,把网络的数据写入缓存。
- 而具体的缓存逻辑 OkHttp 内置封装了一个 Cache 类,它利用 DiskLruCache,用磁盘上的有限大小空间进行缓存,按照 LRU 算法进行缓存淘汰,这里也不再展开。
总结
- OkHttpClient 实现 Call.Factory,负责为 Request 创建 Call;
- RealCall 为具体的 Call 实现,其 enqueue() 异步接口通过 Dispatcher 利用 ExecutorService 实现,而最终进行网络请求时和同步 execute() 接口一致,都是通过 getResponseWithInterceptorChain() 函数实现;
- getResponseWithInterceptorChain() 中利用 Interceptor 链条,分层实现缓存、透明压缩、网络 IO 等功能;
参考: