首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Picasso使用简介及分析(13)

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,敬请期待
返回列表