OkHttp优点及工作原理

May you return with a young heart after years of fighting.
愿你出走半生,归来仍是少年。​​​

1.OkHttp的优点

网络优化方面
(1)内置连接池,支持连接复用;
(2)支持gzip压缩响应体;
(3)通过缓存避免重复的请求;
(4)支持http2,对一台机器的所有请求共享同一个socket。

功能方面
功能全面,满足了网络请求的大部分需求

扩展性方面:
责任链模式使得很容易添加一个自定义拦截器对请求和返回结果进行处理

2.原理

工作流程:
(1)通过OkhttpClient创建一个Call,并发起同步或异步请求时;
(2)okhttp会通过Dispatcher对我们所有的RealCall(Call的具体实现类)进行统一管理,并通过 execute()及enqueue()方法对同步或异步请求进行处理;
(3)execute()及enqueue()这两个方法会最终调用RealCall中的getResponseWithInterceptorChain()(重点)方法,从拦截器链中获取返回结果;
(4)拦截器链中,依次通过RetryAndFollowUpInterceptor(重定向拦截器)、BridgeInterceptor(桥接拦截器)、CacheInterceptor(缓存拦截器)、ConnectInterceptor(连接拦截器)、CallServerInterceptor(网络拦截器)对请求依次处理,与服务的建立连接后,获取返回数据,再经过上述拦截器依次处理后,最后将结果返回给调用方。
原理图:
OkHttp优点及工作原理_第1张图片

2.各个默认拦截器的作用:

2.1RetryAndFollowUpInterceptor
负责重试或请求重定向。
原理:构建一个StreamAllocation对象,然后调用下一个拦截器获取结果,从返回结果中获取重定向的request,如果重定向的request不为空的话,并且不超过重定向最大次数的话就进行重定向,否则返回结果。注意:这里是通过一个while(true)的循环完成下一轮的重定向请求。

2.1BridgeInterceptor
对请求头以及返回结果处理。
负责将原始Requset转换给发送给服务端的Request以及将Response转化成对调用方友好的Response。
具体就是对request添加Content-Type、Content-Length、cookie、Connection、Host、Accept-Encoding等请求头以及对返回结果进行解压、保持cookie等。

2.3CacheInterceptor
负责读取缓存以及更新缓存。
在请求阶段:
读取候选缓存cacheCandidate;
根据originOequest和cacheresponse创建缓存策略CacheStrategy;
根据缓存策略,来决定是否使用网络或者使用缓存或者返回错误。
具体的的缓存策略就是http的缓存策略。
在结果返回阶段:
负责将网络结果进行缓存(使用于DiskLruCache)。
OkHttp优点及工作原理_第2张图片
2.4ConnectInterceptor
负责与服务器建立连接
使用StreamAllocation.newStream来和服务端建立连接,并返回输入输出流(HttpCodec),实际上是通过StreamAllocation中的findConnection寻找一个可用的Connection,然后调用Connection的connect方法,使用socket与服务端建立连接。

2.5CallServerInterceptor
负责从服务器读取响应的数据

主要的工作就是把请求的Request写入到服务端,然后从服务端读取Response。
写入请求头、写入请求体、读取响应头、读取响应体。

3.OkHttp中Dispatcher和线程池

OkHttp中的线程池是一个 newCachedThreadPool。
所以在 OkHttp 中线程池只是一个辅助作用,仅仅是用来做线程缓存,便于复用的。
真正控制请求并发数量和执行时机是通过调度器 Dispatcher 完成的。
Dispatcher 为维护请求状态,并维护一个线程池,用于执行请求。
realCall.execute()方法:
OkHttp优点及工作原理_第3张图片
先将RealCall加入Dispatcher的runningSyncCalls(正在执行队列)队列,然后调用getResponseWithInterceptorChain获取Response,最后调用Dispatcher的finished方法,将自身从runningSyncCalls移除,然后进行轮询readyAsyncCalls(就绪队列)队列,取出ready的异步任务在满足条件的情况下进行执行。

4.OkHttp中的设计模式

责任链模式:拦截器链
单例模式:线程池
观察者模式:各种回调监听
策略模式:缓存策略
Builder模式:OkHttpClient的构建过程
外观模式:OkHttpClient封装了很对类对象
工厂模式:Socket的生产

参考链接

你可能感兴趣的:(http,网络)