Board logo

标题: Picasso使用简介及分析(13) [打印本页]

作者: look_w    时间: 2019-2-18 20:00     标题: Picasso使用简介及分析(13)

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,敬请期待




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0