美文网首页
OKhttp源码解析

OKhttp源码解析

作者: 默默_大魔王 | 来源:发表于2019-10-09 09:02 被阅读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:请求服务器拦截器,向服务器发送数据,解析读取的数据。

    相关文章

      网友评论

          本文标题:OKhttp源码解析

          本文链接:https://www.haomeiwen.com/subject/rsfcuctx.html