OKHttp的拦截器链设计模式的应用(简介)
当执行如下代码时,如果底层是通过OKHttp来请求图片,会先执行OKHttp自带的拦截器中的方法,拦截器中的逻辑执行完之后才会执行真正的图片请求
okhttp3.Response response = client.newCall(builder.build()).execute();
看一下Call接口的实现类RealCall中execute方法的具体实现。
@Override
public Response execute() throws IOException {
...
try {
//开始执行拦截器链
Response result = getResponseWithInterceptorChain(false);
...
return result;
} finally {
client.dispatcher().finished(this);
}
}
private Response getResponseWithInterceptorChain(boolean forWebSocket)
throws IOException {
Interceptor.Chain chain = new ApplicationInterceptorChain(0, originalRequest, forWebSocket);
return chain.proceed(originalRequest);
}
class ApplicationInterceptorChain implements Interceptor.Chain {
private final int index; //拦截器的计数器,表示当前需要执行第几个拦截器中的方法。
...
ApplicationInterceptorChain(int index, Request request, boolean forWebSocket) {
this.index = index;
...
}
...
@Override
public Response proceed(Request request) throws IOException {
//判断是否超出拦截器集合的下标
if (index < client.interceptors().size()) {
//在Picasso中,维护了一个拦截器的集合,这里通过对集合内拦截器的下标索引
//来依次获取开发者所定义的拦截器
Interceptor.Chain chain = new ApplicationInterceptorChain(index + 1, request, forWebSocket);
Interceptor interceptor = client.interceptors().get(index);
//然后依次调用拦截方法
Response interceptedResponse = interceptor.intercept(chain);
if (interceptedResponse == null) {
throw new NullPointerException("application interceptor " + interceptor + " returned null");
}
return interceptedResponse;
}
// 拦截器执行完了。就开始执行真正的网络请求了。
return getResponse(request, forWebSocket);
}
}
到这里,Picasso的使用介绍及流程分析就全部介绍完了,如果有不对的地方请留言指正,接下来,老衲将会带领大家分析另一款超优秀的图片加载框架Glide,敬请期待 |