OKHttp 里面的Interceptor解析

okhttp 里面有一个类Interceptor主要负责 request的提交 获取response不知道这个是不是拦截器模式。先介绍一下思路:RealCall类里面的下面的方法

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);
  }
}
  1. Interceptor 里有一个chain的接口,chain接口里有 Response proceed(Request request);
    RealInterceptorChain 构造方法里获取拦截器的集合,proceed 方法得到第一个拦截器,再调用interceptor.inercept(Chain chain)
    如果intercept 具体的类里面例如 BrideInterceptor 继续调用 chain.proceed();这将陷入一个来回回调的过程,直到回调完所有的interceptor

  2. 下面通过一个demo来说明这个过程

public class Request {
    private String request;

    public String getRequest() {
        return request;
    }

    public void setRequest(String request) {
        this.request = request;
    }
}


public class Response {
   String response;

    public String getResponse() {
        return response;
    }

    public void setResponse(String response) {
        this.response = response;
    }
}

public interface Interceptor {
    Response intercept(Chain chain);
    interface Chain{
        Response proceed(Request request);
        Request request();
    }
}

//拦截器中处理集合中所有的拦截
public class InterceptorChainConcrete implements Interceptor.Chain {
    List<Interceptor> interceptors;
    int index;
    int calls;
    Request request;
    public InterceptorChainConcrete(List<Interceptor> interceptors, int index,Request req) {
        this.interceptors = interceptors;
        this.index = index;
        this.request = req;
    }

    @Override
    public Response proceed(Request request) {

        Response finish = new Response();
        finish.setResponse("finish");
        if (index >= interceptors.size()) return finish;
        calls++;
        InterceptorChainConcrete next = new InterceptorChainConcrete(
                interceptors,index + 1,request);
        Interceptor interceptor = interceptors.get(index);
        Response res = interceptor.intercept(next);
        res.setResponse(request.getRequest());
        System.out.println("calls:"+calls+" "+request.getRequest()+" index:"+index);
        return res;
    }



    @Override
    public Request request() {
        return request;
    }
}
//拦截器的具体实现类
public class Interceptor1 implements Interceptor {

    @Override
    public Response intercept(Chain chain) {
        InterceptorChainConcrete realChain = (InterceptorChainConcrete) chain;
        Request request = realChain.request;

        return realChain.proceed(request);
    }
}

public class Interceptor2 implements Interceptor {
    @Override
    public Response intercept(Chain chain) {
        InterceptorChainConcrete realChain = (InterceptorChainConcrete) chain;
        Request request = realChain.request;

        return realChain.proceed(request);
    }
}
//拦截器中最后一个类 终止 回调
public class InterceptorFinish implements Interceptor {
    @Override
    public Response intercept(Chain chain) {

        Response response = new Response();
        response.setResponse("finish");
        return response;
    }
}

测试方法:
  public static com.example.Response Test(){
        List<Interceptor> interceptors = new ArrayList<>();

        interceptors.add(new Interceptor1());
        interceptors.add(new Interceptor2());
        interceptors.add(new InterceptorFinish());
        com.example.Request request = new com.example.Request();
        request.setRequest("request");
       Interceptor.Chain chain = new InterceptorChainConcrete(
                interceptors,  0, request);
        return chain.proceed(request);
    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值