Android图片加载框架Fresco分析(七)

ImagePipeline类中的

/**
 * Submits a request for bitmap cache lookup.
 *
 * @param imageRequest the request to submit
 * @return a DataSource representing the image
 */
public DataSource<CloseableReference<CloseableImage>> fetchImageFromBitmapCache(
    ImageRequest imageRequest,
    Object callerContext) {
  try {
    Producer<CloseableReference<CloseableImage>> producerSequence =
        mProducerSequenceFactory.getDecodedImageProducerSequence(imageRequest);
    return submitFetchRequest(
        producerSequence,
        imageRequest,
        ImageRequest.RequestLevel.BITMAP_MEMORY_CACHE,
        callerContext);
  } catch (Exception exception) {
    return DataSources.immediateFailedDataSource(exception);
  }
}

之前分析了生产者,现在分析一下消费者,上面这段代码中的producerSequence就是生产者序列。我们进入return的submitFetchRequest代码中看一下:

  private <T> DataSource<CloseableReference<T>> submitFetchRequest(
  Producer<CloseableReference<T>> producerSequence,
  ImageRequest imageRequest,
  ImageRequest.RequestLevel lowestPermittedRequestLevelOnSubmit,
  Object callerContext) {
try {
  ImageRequest.RequestLevel lowestPermittedRequestLevel =
      ImageRequest.RequestLevel.getMax(
          imageRequest.getLowestPermittedRequestLevel(),
          lowestPermittedRequestLevelOnSubmit);
  SettableProducerContext settableProducerContext = new SettableProducerContext(
      imageRequest,
      generateUniqueFutureId(),
      mRequestListener,
      callerContext,
      lowestPermittedRequestLevel,
    /* isPrefetch */ false,
      imageRequest.getProgressiveRenderingEnabled() ||
          !UriUtil.isNetworkUri(imageRequest.getSourceUri()),
      imageRequest.getPriority());
  return CloseableProducerToDataSourceAdapter.create(
      producerSequence,
      settableProducerContext,
      mRequestListener);
} catch (Exception exception) {
  return DataSources.immediateFailedDataSource(exception);
}
  }

其中的好像ImageRequest被作为参数给了SettableProducerContext类,这个我也不知道是做什么用的,先看一下return的部分,出现了一个适配器。CloseableProducerToDataSourceAdapter,看名字的意思应该是,将生产者转换成DataSource来使用的。此Adapter继承自AbstractProducerToDataSourceAdapter,在父类中create了消费者。并且执行了生产者中的produceResults方法,即开启了请求去下载图片和处理图片。

protected AbstractProducerToDataSourceAdapter(
    Producer<T> producer,
    SettableProducerContext settableProducerContext,
    RequestListener requestListener) {
  mSettableProducerContext = settableProducerContext;
  mRequestListener = requestListener;
  mRequestListener.onRequestStart(
      settableProducerContext.getImageRequest(),
      mSettableProducerContext.getCallerContext(),
      mSettableProducerContext.getId(),
      mSettableProducerContext.isPrefetch());
  producer.produceResults(createConsumer(), settableProducerContext);
}

private Consumer<T> createConsumer() {
  return new BaseConsumer<T>() {
    @Override
    protected void onNewResultImpl(@Nullable T newResult, boolean isLast) {
      AbstractProducerToDataSourceAdapter.this.onNewResultImpl(newResult, isLast);
    }

    @Override
    protected void onFailureImpl(Throwable throwable) {
      AbstractProducerToDataSourceAdapter.this.onFailureImpl(throwable);
    }

    @Override
    protected void onCancellationImpl() {
      AbstractProducerToDataSourceAdapter.this.onCancellationImpl();
    }

    @Override
    protected void onProgressUpdateImpl(float progress) {
      AbstractProducerToDataSourceAdapter.this.setProgress(progress);
    }
  };
}

构造方法中的最后一句,让生产者开始生产,即开始下载图片并且按照之前设置的序列对图片进行处理。