美文网首页
OkHttp源码(三:拦截器链)

OkHttp源码(三:拦截器链)

作者: 长空_ca51 | 来源:发表于2019-03-06 17:23 被阅读0次

    我们知道,无论是同步还是异步调用,都有一个关键代码调用getResponseWithInterceptorChain得到Response。 以同步为例

    其实getResponseWithInterceptorChain内部就是构建了拦截器列表 和拦截器链RealInterceptorChain,通过chain.proceed来处理请求

    可以看到,在该方法中,我们依次添加了用户自定义的interceptor、retryAndFollowUpInterceptor、BridgeInterceptor、CacheInterceptor、ConnectInterceptor、 networkInterceptors、CallServerInterceptor,并将这些拦截器传递给了这个RealInterceptorChain。拦截器之所以可以依次调用,并最终再从后先前返回Response,都依赖于RealInterceptorChain的proceed方法。

    RealInterceptorChain#proceed()

    这里index就是我们刚才的0,也就是从0开始,如果index超过了过滤器的个数抛出异常,后面会再new一个RealInterceptorChain,而且会将参数传递,并且index+1了,接着获取index的interceptor,并调用intercept方法,传入新new的next对象,这里用了递归的思想来完成遍历,随便找一个interceptor,看一下intercept方法。

    这是ConnectInterceptor的源码,这里得到chain后,进行相应的处理后,继续调用proceed方法,那么接着刚才的逻辑,index+1,获取下一个interceptor,重复操作,所以现在就很清楚了,这里利用递归循环,也就是OkHttp最经典的责任链模式

    下面是拦截器链的调用流程,后面的章节会依次讲解每个拦截器

    retryAndFollowUpInterceptor——失败和重定向过滤器

    BridgeInterceptor——封装request和response过滤器

    CacheInterceptor——缓存相关的过滤器,负责读取缓存直接返回、更新缓存

    ConnectInterceptor——负责和服务器建立连接,连接池等

    networkInterceptors——配置 OkHttpClient 时设置的 networkInterceptors

    CallServerInterceptor——负责向服务器发送请求数据、从服务器读取响应数据(实际网络请求)

    相关文章

      网友评论

          本文标题:OkHttp源码(三:拦截器链)

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