OKhttp源码解析

2019-10-09  本文已影响0人  默默_大魔王

优缺点

1:支持http/2允许对同一主机的所有请求共享一个套接字
2:通过连接池,减少了请求延迟
3:默认Gzip压缩数据(okio框架自动完成gzip数据读取)
4:响应缓存,避免重复请求网络
5;请求失败自动重试主机的其他ip,自动重定向

OkhttpClient-》Request-》call-》ResponseBody 四个对象完成一个get请求
所有请求逻辑大部分在拦截器中,在进入拦截器之前,还需要依靠分发器来调配请求任务。

一:什么是分发器?

概念,内部维护队列与线程池,完成请求调配,五大默认拦截器完成整个请求过程

分发器 正在请求数量是有限制的,64个,同一域名正在请求的个数7最大请求host是5,值都可以修改,默分别是64和5,满足需求执行线程发起请求,如果不满足,readyAsyncCall.add()readyAsyncCallrunningAsyncCall流程请求结束,如果runningAsyncCall大于64并且readAsyncCall不为空, 移除一个请求,runningAsyncCall再从readAsyncCall减一个,
线程池
当提交一个任务的时候,线程数量小于corePoolSize,新建线程来处理被添加的任务
当数量大于corePoolSize,不存在空闲线程,新任务被添加到等待队列,添加成功则等待空闲线程
添加失败,线程数量大于maxmumPoolSize,新建线程执行新任务,

线程数量等于maxmunPoolSize,拒绝此任务

1:`arrayBlockQueue`,指定核心线程数,会阻塞线程
2:`linkedBlocjQueue`,可以不指定,默认是int最大值,会阻塞线程
3:`synchBlockQueue`,默认核心线程数是0,不会阻塞线程,当前线程没有执行完,如果有空位,会立马执行下一个线程,okhttp使用的是此线程,能满足最大并发。
二:什么是拦截器

五大拦截器,使用的是责任链模式,层层递进
1:重试重定向取消拦截器,负责判断用户是否取消了请求,获取结果之后或根据响应码判断是否重定向,如果满足条件,就会之重启执行所有拦截器

(1):重试重定向判定,okhttpclient默认可以重试,一下异常不会重试,协议异常,socket异常,ssl证书格式问题,ssl校验没问题
(2):重定向次数最大20,每次重定向都会加一,直到20次后,不再重定向。

2:桥接拦截器
(1):负责将http必备的请求头加入到请求中,如(Host请求头,GZip压缩),获取结果之后,读取cookie,解压Gzip;

3:缓存拦截器

一: 缓存条件

(第一步):检查没有缓存,发送一个请求
(第二步):https会保存握手信息,如果首次发送htpps请求没有缓存握手信息,发起网络或请求
(第三步):判断响应码与响应头,可以缓存的响应码为,200,230,204,300,301,404,410,414,501,308,或者缓存响应码为302,307同时存在响应头Explres或者Cache-Control 包含max-age private public其中的一个,同时请求的响应头和缓存的响应头中不包含Cache-Control:no-store
(第四步):用户请求配置,如果用户请求头没有设置,cache-control:no-cache或者if-modified-since或者 if-none-match

以上四步都满足,okhttp使用缓存,响应资源不变

二:缓存时效性

1:缓存有效性时间判定max-age【秒】 缓存最大有效时间(精准时间)
2:如果没有max-age,再去去判断 Expires(过期时间)(精准时间)
3:缓存响应包含Last-Modified:响应最后修改时间(大概时间)
4:缓存过期后有效期时间,maxstateMillis
三:缓存检测

4:连接拦截器,使用的socket链接

5:请求服务器拦截器,向服务器发送数据,解析读取的数据。

上一篇下一篇

猜你喜欢

热点阅读