Okhttp动态创建责任链式Interceptor

it2022-05-05  139

拦截器容器,装载了所有拦截器

private List<Interceptor> interceptors = new ArrayList<>();

 拦截器容器添加拦截器

public void addInterceptors(Interceptor interceptor) { this.interceptors.add(interceptor); }

创建OKhttp配置一个默认拦截器

OkHttpClient.Builder mOkHttpBuilder = new OkHttpClient.Builder() .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) .addInterceptor(默认拦截器) .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);

 默认拦截器实现:创建拦截器责任链表

@Override public Response intercept(Chain chain) throws IOException { return new TChain(interceptors, chain).proceed(); }

 自定义责任链表类

class TChain implements Chain { private List<Interceptor> interceptors; private Chain chain; private Request request; private int index = 0; public TChain(List<Interceptor> interceptors, Chain chain) { this(interceptors, chain, chain.request(), 0); } private TChain(List<Interceptor> interceptors, Chain chain, Request request, int index) { this.interceptors = interceptors; this.chain = chain; this.request = request; this.index = index; } /** * 依次取出拦截器链表中的每个拦截器去获取Response * * @param request * @return * @throws IOException */ @Override public Response proceed(Request request) throws IOException { return index >= interceptors.size() ? chain.proceed(request) : interceptors.get(index).intercept(new TChain(interceptors, chain, this.request = request, index + 1)); } @Override public Request request() { return request; } public Response proceed() throws IOException { return proceed(this.request); } @Override public Connection connection() { return chain.connection(); } @Override public Call call() { return chain.call(); } @Override public int connectTimeoutMillis() { return chain.connectTimeoutMillis(); } @Override public Chain withConnectTimeout(int timeout, TimeUnit unit) { return chain.withConnectTimeout(timeout, unit); } @Override public int readTimeoutMillis() { return chain.readTimeoutMillis(); } @Override public Chain withReadTimeout(int timeout, TimeUnit unit) { return chain.withConnectTimeout(timeout, unit); } @Override public int writeTimeoutMillis() { return chain.writeTimeoutMillis(); } @Override public Chain withWriteTimeout(int timeout, TimeUnit unit) { return chain.withWriteTimeout(timeout, unit); } }

 


最新回复(0)