安卓架构师开发进阶

2019-08-12 Okhttp框架知识梳理(课堂笔记)

2019-08-16  本文已影响2人  默默_大魔王

优缺点

1:支持http/2允许对同一主机的所有请求共享一个套接字

2:通过连接池,减少了请求延迟

3:默认Gzip压缩数据(okio框架自动完成gzip数据读取)

4:响应缓存,避免重复请求网络

5;请求失败自动重试主机的其他ip,自动重定向

OkhttpClient-》Request-》call-》ResponseBody  四个对象完成一个get请求

所有请求逻辑大部分在拦截器中,在进入拦截器之前,还需要依靠分发器来调配请求任务。

一:什么是分发器?

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

分发器  正在请求数量是有限制的,64个,同一域名正在请求的个数7最大请求host是5,值都可以修改,默认分别是64和5,满足需求执行线程发起请求,如果不满足,readyAsyncCall.add()

从readyAsyncCall到runningAsyncCall流程

请求结束,如果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:请求服务器拦截器,向服务器发送数据,解析读取的数据。

上一篇下一篇

猜你喜欢

热点阅读