由Square公司开源的一个处理网络请求的开源框架
Android 4.4 开始HttpUrlConnection的底层实现采用的OkHttp
HTTP是应用层协议
特点
-
支持HTTP/2并允许对统一主机的所有请求共享一个套接字(socket)
-
通过连接池,减少了请求延迟
Scoket对象复用池
-
默认通过GZip压缩数据
-
响应缓存,避免了重复请求的网络
-
请求失败自动重试主机的其他ip,自动重定向
调用流程
-
OkHttpClient
-
Request
-
Call(RealCall)
创建一个Call对象
-
execute & enqueue
同步或者异步执行请求
-
分发器 Dispathcer
高并发任务分发
线程池安排队
内部维护队列与线程池,完成请求调配
-
Interceptor
五大默认拦截器完成整个请求
-
Response
异步请求(enqueue)
-
Ready 队列(等待执行)
-
Running 队列(马上执行)
如果正在执行的异步任务 < 64,同时进行的异步请求不能超过64
(考虑到设备自身的压力)正在执行的任务队列
(对同一个域名)< 5,即相同host的请求不能超过5个(考虑到服务器并发的压力)同时满足以上两个条件,则可以直接将
Call放入Running队列中
五大拦截器
-
RetryAndFollowUpInterceptor
重定向和重试处理
重试拦截器在交出(交给下一个连接器)之前,负责判断用户是否取消了请求,在获得了结果之后会根据响应码判断是否需要重定向,如果满足条件那么就会重启执行所有拦截器
-
BridgeInterceptor
Header/Body的处理
桥接拦截器在交出之前,负责将HTTP协议必备的请求头加入其中(如:HOST)并添加一些默认的行为(如:GZIP压缩);
在得到了结果后,调用保存cookie接口并解析GZIP数据
-
CacheInterceptor
缓存的处理
缓存拦截器,在交出之前读取并判断是否使用缓存,获得结果后判断是否缓存
-
ConnectInterceptor
连接处理
连接拦截器交出之前,负责找到或者新建一个连接,并获得对应的socket流,在获得结果后不进行额外的处理
-
CallServerInterceptor
服务器通信
请求服务器拦截器进行真正的与服务器通信,向服务器发送数据,解析读取的相应数据
建立socket连接
-
NetworkInterceptor
WebSocket使用的拦截器
五大拦截器职责单一,各司其职
责任链模式
addInterceptor 一定执行,这里添加的拦截器默认在责任链最顶端,所以一定会执行
这里是最先拿到 Request ,最后拿到 Repsonse
addNetworkInterceptor 不一定执行,这里添加的拦截器可能会在前面拦截器中断或者异常以后不会执行
这里是真正的,完成的完整处理以后的Request