OKhttp源码流程分析笔记

okhttp主要包含构建者模式、责任链模式等。主要流程大致如下:

构建者模式构造request    okhttpclient对象   两套字段,在build方法返回赋值。

同步是调用在realCall类(实现Call接口)中的execute方法(设置拦截器链)中dispatcher的execute方法把请求添加到同步请求队列。在finally中调用dispatcher的finished方法,移除队列,更新请求数量。

异步请求是调用realCall的enqueue方法,再调用dispatcher的enqueue方法,该方法中根据判断把请求加入到准备或者请求队列(此时创建线程池,调用execute方法),enqueue方法的参数是AsyncCall(Runnbale对象,封装请求回调Callback),在AsyncCall的execute方法中,设置拦截器链,回调请求回调对象callback,最后调用finish方法。比同步方法多执行一个promoteCalls方法(遍历判断从等待队列移除,加入到执行队列)。

异步请求是生产消费者模式,dispatcher是生产者,线程池是消费者,一个缓存队列,一个执行队列。

getResponseWithInterceptorChains方法内有一个intercepter类型的集合,依次添加的retryandfollowupinterceptor(RealCall构造函数中初始化)、bridgeinterceptor、cacheinterceptor、connectinterceptor、callserverinterceptor。

创建了RealInterceptorChain,调用proceed方法,interceptor集合作为参数传入。

Proceed方法中创建RealInterceptorChain对象,index变为index+1,根据index得到interceptor,调用interceptor方法(chain对像为参数)。

Retryandfollowupinterceptor类的interceptor方法:

创建streamallocation对象,调用chain的proceed方法。对重连次数进行判断,大于20就释放不再重连。对response进行拦截返回给上一个拦截器。

Bridgeinterceptor的interceptor方法:

把用户的请求转换成符合请求协议的格式,比如添加请求头,设置cookie,content-type等,调用chain的proceed方法,拦截response,解压(gzip)为用户可用的response。

缓存策略

Cache的put方法,只对get方式请求进行缓存,创建entry对象(url,header、code等不含body),response作为参数传入,缓存策略是DiskLruCache的editor创建缓存文件,key是url的md5加密字段的十六进制。body是在CacheRequestImpl中(实现了CacheRequest接口)被缓存。

Cache的get方法,cache中得到缓存文件DiskLruCache.Snapshot,作为参数生成entry,调用entrys的response方法生成Response,校验请求与相应是否匹配,返回结果。

CacheInterceptor的interceptor方法,从缓存中取,有就返回,否则null。chain和缓存作为参数创建缓存策略类CacheStrategy(内部一个请求对象,一个缓存对象),主要作用是判断该用缓存还是网络请求,之后判断得到的request和cacheresponse的一系列条件,构建对应的Response(没网没缓存返回504、返回码未被修改、缓存未过期304,返回缓存),有缓存,就更新缓存命中率,也就是重复使用率吧。

connectInterceptor的interceptor的方法:根据chain创建request对象,得到前边传过来的streamallocation,赋值给StreamAllocation对象,调用chain的proceed方法。执行streamallocation的newstream方法得到HttpCodec对象,StreamAllocation的connection方法得到RealConnecttion对象,然后二者当做参数传入chain的proceed方法。

在newstream方法内调用findhealthyconnection方法返回RealConnection(用于进行实际的网络IO传输),RealConnection调用newCodec方法生产HttpCodec对象(处理编码request和解码response)。findhealthyconnection内部开启死循环调用findconnection方法创建RealConnection对象,对得到的RealConnection对象进行一系列检查(新的就直接返回,其他就得检查是否健康,不健康移除再找,健康返回)。findConnection方法中若realconnection不为空,则复用,否则从连接池获取一个,连接池没有就新建一个RealConnection。接着调用RealConnection的connect方法发起链接请求,将链接存入连接池以便下次复用。然后返回RealConnection。

连接池connectionPool:

Get方法,先遍历队列集合collections,找到合格的链接,调用streamallocation的acquire方法,同时返回该链接。acquire内部把链接赋值给全局变量connection,创建streamAllocation的弱引用对象,并添加到队列集合中。

Put方法,先开启清理任务runnable,内部开启死循环调用clearnup方法,并返回下次清理时间间隔,clearnup通过for循环遍历collections,判断移除无用链接。

Callserverintercptor的interceptor方法:一些对象的获取如httpcodec、streamallocation、RealConnection等,httpcodec调用方法写入请求头,然后判断请求方式和请求body等条件,进而判断100-continue来询问服务器是否符合规范等,发送请求,拿到response,设置Response的body,返回response给上一个chain。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值