Fresco 源码分析(二) Fresco客户端与服务端交互(3) 前后台打通

4.2.1.2.4 PipelineDraweeControllerBuilder.obtainController()源码分析 续

上节中我们提到两个核心的步骤
1. obtainDataSourceSupplier()获取到了一个DataSourceSupplier
2. 然后mPipelineDraweeControllerFactory类new了一个controller

还是先从广度分析,然后再深度分析
* PipelineDraweeController.newController()源码 *

在这里无非新创建了一个PipelineDraweeController

  public PipelineDraweeController newController(
      Supplier<DataSource<CloseableReference<CloseableImage>>> dataSourceSupplier,
      String id,
      Object callerContext) {
    return new PipelineDraweeController(
        mResources,
        mDeferredReleaser,
        mAnimatedDrawableFactory,
        mUiThreadExecutor,
        dataSourceSupplier,
        id,
        callerContext);
  }

那广度就先看到这里,这时就要再从深度开始看
这时我们要看以下的几个方法
1. PipelineDraweeControllerBuilder.obtainDataSourceSupplier()的过程
2. 新建PipelineDraweeController的过程

* AbstractDraweeControllerBuilder.obtainDataSourceSupplier() *

 /** Gets the top-level data source supplier to be used by a controller. */
  protected Supplier<DataSource<IMAGE>> obtainDataSourceSupplier() {
    if (mDataSourceSupplier != null) {
      return mDataSourceSupplier;
    }

    Supplier<DataSource<IMAGE>> supplier = null;

    // final image supplier;
    if (mImageRequest != null) {
      supplier = getDataSourceSupplierForRequest(mImageRequest);
    } else if (mMultiImageRequests != null) {
      supplier = getFirstAvailableDataSourceSupplier(mMultiImageRequests);
    }

    // increasing-quality supplier; highest-quality supplier goes first
    if (supplier != null && mLowResImageRequest != null) {
      List<Supplier<DataSource<IMAGE>>> suppliers = new ArrayList<>(2);
      suppliers.add(supplier);
      suppliers.add(getDataSourceSupplierForRequest(mLowResImageRequest));
      supplier = IncreasingQualityDataSourceSupplier.create(suppliers);
    }

    // no image requests; use null data source supplier
    if (supplier == null) {
      supplier = DataSources.getFailedDataSourceSupplier(NO_REQUEST_EXCEPTION);
    }

    return supplier;
  }

老的分析思路继续,我们以第一次请求为例
先判断图片请求的信息,如果只是简单的mImageRequest,那么获取到getDataSourceSupplierForRequest()即可,然后,如果发现有渐进式的请求,那么supplier便基于目前的supplier创建新的supplier

* AbstractDraweeControllerBuilder类的相关方法 *
从下面的方法,便可知,创建了一个对应的Supplier而已,用于获取请求数据的supplier,注意在获取到的匿名的supplier的get方法中,我们看到调用的是getDataSourceForRequest方法,这个我们先备注一下: mark为Q3,便于我们插叙后,继续分析的入口点

  /** Creates a data source supplier for the given image request. */
  protected Supplier<DataSource<IMAGE>> getDataSourceSupplierForRequest(REQUEST imageRequest) {
    return getDataSourceSupplierForRequest(imageRequest, /* bitmapCacheOnly */ false);
  }



  /** Creates a data source supplier for the given image request. */
  protected Supplier<DataSource<IMAGE>> getDataSourceSupplierForRequest(
      final REQUEST imageRequest,
      final boolean bitmapCacheOnly) {
    final Object callerContext = getCallerContext();
    return new Supplier<DataSource<IMAGE>>() {
      @Override
      public DataSource<IMAGE> get() {
        return getDataSourceForRequest(imageRequest, callerContext, bitmapCacheOnly);
      }
      @Override
      public String toString() {
        return Objects.toStringHelper(this)
            .add("request", imageRequest.toString())
            .toString();
      }
    };
  }

第1部分的深度我们就分析到这里
第2部分的深度分析:

4.2.1.2.5 插叙 –> AbstractDraweeController.submitRequest()分析 续

在我们分析的第二篇博客中,提到了AbstractDraweeController.submitRequest()方法,但是到了最后,我们只是留下了一个Q1问题,然后并没有继续分析下去,现在我们要插叙一段

  protected void submitRequest() {
    ......
    mDataSource = getDataSource();
    ......
    final String id = mId;
    final boolean wasImmediate = mDataSource.hasResult();
    final DataSubscriber<T> dataSubscriber......
    mDataSource.subscribe(dataSubscriber, mUiThreadImmediateExecutor);
  }

这次,我们关注的核心是getDataSource()方法,然而这里是抽象类,具体使用的是哪个,当时我们无法分析,现在便可以知道,使用的是PipelineDraweeController类的方法

* PipelineDraweeController.getDataSource 源码分析 *
从以下的代码中,可以看出,只是从Supplier中获取到了dataSource而已
@Override
protected DataSource

4.2.1.2.6 AbstractDraweeControllerBuilder是如何发送请求的 即分析Q3问题

在上面已经提到了,客户端在DraweeController中发送请求的过程中,会调用Supplier的get方法,那么在这里边调用到了AbstractDraweeControllerBuilder.getDataSourceSupplierForRequest()方法中生成的匿名supplier的get()方法

* AbstractDraweeControllerBuilder.getDataSourceSupplierForRequest()方法 *
在以下的方法中,我们看到,匿名的Supplier的get方法中,调用的是AbstractDraweeControllerBuilder自身的getDataSourceForRequest()方法返回的Supplier

  /** Creates a data source supplier for the given image request. */
  protected Supplier<DataSource<IMAGE>> getDataSourceSupplierForRequest(
      final REQUEST imageRequest,
      final boolean bitmapCacheOnly) {
    final Object callerContext = getCallerContext();
    return new Supplier<DataSource<IMAGE>>() {
      @Override
      public DataSource<IMAGE> get() {
        return getDataSourceForRequest(imageRequest, callerContext, bitmapCacheOnly);
      }
      @Override
      public String toString() {
        return Objects.toStringHelper(this)
            .add("request", imageRequest.toString())
            .toString();
      }
    };
  }

那么就继续跟踪呗,发现其为抽象方法,那么跟踪到子类,这时候,我们已经知道使用的是PipelineDraweeControllerBuilder,

* PipelineDraweeControllerBuilder.getDataSourceForRequest()方法 *

  @Override
  protected DataSource<CloseableReference<CloseableImage>> getDataSourceForRequest(
      ImageRequest imageRequest,
      Object callerContext,
      boolean bitmapCacheOnly) {
    if (bitmapCacheOnly) {
      return mImagePipeline.fetchImageFromBitmapCache(imageRequest, callerContext);
    } else {
      return mImagePipeline.fetchDecodedImage(imageRequest, callerContext);
    }
  }

我们模拟的请求是显示到UI层,所以走的是else,即mImagePipeline.fetchDecodeImage();
那么这时候就到了ImagePipeline了,这部分用到了包装的设计模式,以及生产消费的设计模式,又属于另外一部分了,其实到这里,我们才算接触到ImagePipeline请求的核心,这也是Fresco设计的巧妙之处,很多知识不需要我们关心,我们一般来讲,只需要用到SimpleDraweeView即可
到这里,Fresco客户端与服务端的交互分析完毕,下一章节便是,服务端的请求是如何发送出去的以及请求回来的数据如何通过回调通知客户端的
下篇博客链接 : Fresco 源码分析(三) Fresco服务端处理(1) ImagePipeline为何物 (http://blog.csdn.net/ieyudeyinji/article/details/48251653

安卓源码分析群: Android源码分析QQ1群号:164812238

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章