② 怎么组成一条链
继续跟 networkInterceptors
,定义了一个公共获取拦截器列表的方法:
网络异常,图片无法展示
|
看下哪里用到了,定位到 RealCall.getResponseWithInterceptorChain()
中:
网络异常,图片无法展示
|
把拦截器全加到列表里,等下按顺序走,很好理解,然后是这个 RealInterceptorChain
,关注下传入参数,除了关注interceptors列表外,还要关注一个 index,传入的值为0。
然后下面调用了 chain.proceed(originalRequest)
返回了一个Response对象,点进去类看看:
网络异常,图片无法展示
|
核心代码是圈住那里,拆解下步骤:
- 创建一个新的RealInterceptorChain,还是传入拦截器列表,但 index + 1;
- 根据游标获取 当前的拦截器,调用拦截器的 intercept() 方法把新的Chain作为参数传入;
这里其实就是 递归
,先回到一开始的接口:
网络异常,图片无法展示
|
责任链模式有两个要点:如何往后传递处理结果 和 何时结束传递
第一点传递很好理解:
Interceptor实现类调用 intercept(Chain) 往下传递Chain实例,实例中包含了拦截器列表、下一个拦截器的下标、处理后的request实例 等。
第二点何时结束:
最后一个拦截器调用
chain.proceed()
返回Response实例为止,而这个实例会往前传递,前面调用了chain.proceed()
的拦截器可以获得Response实例并进行加工(如打日志),第一个调用了chain.proceed()
的拦截器得到的就是处理完后的Response。
所以OkHttp的拦截器/过滤器是 双向
的,而Chain接口就是链接其中的链条:
- 前 → 后:request()获得当前request实例,拦截器可对请求进行加工,可也调用intercept往下传递Chain;
- 后 → 前:proceed()获得当前response实例,拦截器可对响应进行加工,作为返回值往上传;
真是妙啊!!!普通责任链从头到尾单向,OkHttp利用递归return活活正成了双向,TQL~
得找机会用上,以上就是本节的全部内容,谢谢~