1.将拦截器添加到ArrayList
final class RealCall implements Call {
Response getResponseWithInterceptorChain() throws IOException {
//将Interceptor添加到ArrayList
List<Interceptor> interceptors = new ArrayList<>();
interceptors.addAll(client.interceptors());
interceptors.add(new RetryAndFollowUpInterceptor(client));
interceptors.add(new BridgeInterceptor(client.cookieJar()));
interceptors.add(new CacheInterceptor(client.internalCache()));
interceptors.add(new ConnectInterceptor(client));
if (!forWebSocket) {
interceptors.addAll(client.networkInterceptors());
}
interceptors.add(new CallServerInterceptor(forWebSocket));
//第一次的index为0
Interceptor.Chain chain = new RealInterceptorChain(interceptors, transmitter, null,
0, originalRequest, this, client.connectTimeoutMillis(),
client.readTimeoutMillis(), client.writeTimeoutMillis());
//执行请求后,得到结果
Response response = chain.proceed(originalRequest);
return response;
}
}
2.拦截器的执行-责任链模式
public final class RealInterceptorChain implements Interceptor.Chain {
private final int index; //当前运行的Interceptor在ArrayList的索引
public Response proceed(Request request, Transmitter transmitter,
@Nullable Exchange exchange)
throws IOException {
//每次index都基于上次的index +1,这样每次取得的就是下一个拦截器
RealInterceptorChain next = new RealInterceptorChain(interceptors, transmitter,
exchange, index + 1, request, call, connectTimeout, readTimeout, writeTimeout);
Interceptor interceptor = interceptors.get(index);
//执行拦截器的方法的时候,携带了RealInterceptorChain作为参数,这样可以
//调用这个chain的proceed
Response response = interceptor.intercept(next);
return response;
}
}
3.总结
RetryAndFollowUpInterceptor:执行下一个拦截器,针对结果或者处理过程中的异常来进行重试或者重定向;
BridgeInterceptor:补充headers;执行下一个拦截器;处理返回的response;
CacheInterceptor:结果缓存,如果能用就返回缓存;如果不能用就执行下一个拦截器;
ConnectInterceptor:
CallServerInterceptor
原文地址:https://blog.csdn.net/lostfish123/article/details/134674139
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_4459.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。