拆轮子:OkHttp 的源码解析(四):拦截器(Intercep

2017-05-10  本文已影响199人  ldlywt

OkHttp3.7源码分析文章列表如下:
拆轮子:OkHttp 的源码解析(一):概述
拆轮子:OkHttp 的源码解析(二):流程分析
拆轮子:OkHttp 的源码解析(三):任务分发器(Dispatcher)
拆轮子:OkHttp 的源码解析(四):拦截器(Interceptor)

拦截器接口

public interface Interceptor {
  Response intercept(Chain chain) throws IOException;

  interface Chain {
    Request request();
    Response proceed(Request request) throws IOException;
    Connection connection();
  }
}

okhttp 默认的拦截器

默认的拦截器
  1. retryAndFollowUpInterceptor
  1. BridgeInterceptor
  1. CacheInterceptor
  1. ConnectInterceptor
  1. CallServerInterceptor

getResponseWithInterceptorChain() 分析

  Response getResponseWithInterceptorChain() throws IOException {
    // Build a full stack of interceptors.
    List<Interceptor> interceptors = new ArrayList<>();
    interceptors.addAll(client.interceptors());
    interceptors.add(retryAndFollowUpInterceptor);
    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));

    Interceptor.Chain chain = new RealInterceptorChain(
        interceptors, null, null, null, 0, originalRequest);
    return chain.proceed(originalRequest);
  }

networkInterceptors : 配置 OkHttpClient 时设置的一个拦截器的 List。

这里主要做了如下几件事:

责任链模式

下面设计到责任链模式,如果你不知道什么是责任链模式,请点击

Android设计模式源码解析之责任链模式

多个拦截器配置构成一个拦截器链 Interceptor.Chain,环环相扣,最终圆满完成一次网络请求。

借用一张图来表示:

拦截器链.png

如果你还想看每个 Interceptor 的具体分析
或者想看拦截器链的proceed方法
请点击下面博文:
OkHttp 3.7源码分析(二)——拦截器&一个实际网络请求的实现
友情提示:慎点,很容易看晕的,o(╯□╰)o

上一篇 下一篇

猜你喜欢

热点阅读