【Android】Fresco圖片加載框架(二) - Producer

jopen 8年前發布 | 10K 次閱讀 Fresco Android開發 移動開發

  private Producer<CloseableReference<CloseableImage>> getBasicDecodedImageSequence(
      ImageRequest imageRequest) {
    Preconditions.checkNotNull(imageRequest);
    Uri uri = imageRequest.getSourceUri();
    Preconditions.checkNotNull(uri, "Uri is null.");
    if (UriUtil.isNetworkUri(uri)) {
      return getNetworkFetchSequence();
    } else if (UriUtil.isLocalFileUri(uri)) {
      if (MediaUtils.isVideo(MediaUtils.extractMime(uri.getPath()))) {
        return getLocalVideoFileFetchSequence();
      } else {
        return getLocalImageFileFetchSequence();
      }
    } else if (UriUtil.isLocalContentUri(uri)) {
      return getLocalContentUriFetchSequence();
    } else if (UriUtil.isLocalAssetUri(uri)) {
      return getLocalAssetFetchSequence();
    } else if (UriUtil.isLocalResourceUri(uri)) {
      return getLocalResourceFetchSequence();
    } else if (UriUtil.isDataUri(uri)) {
      return getDataFetchSequence();
    } else {
      String uriString = uri.toString();
      if (uriString.length() > 30) {
        uriString = uriString.substring(0, 30) + "...";
      }
      throw new RuntimeException("Unsupported uri scheme! Uri is: " + uriString);
    }
  }

看代碼可知道,就是根據 ImageRequest Uri ,選擇一個sequence Producer,我們這里假設是網絡請求圖片,所以選擇的是圖中紅色方法 getNetworkFetchSequence 它也是返回一個Producer (可粗略看)

  /**

  • swallow result if prefetch -> bitmap cache get ->
  • background thread hand-off -> multiplex -> bitmap cache -> decode -> multiplex ->
  • encoded cache -> disk cache -> (webp transcode) -> network fetch. */ private synchronized Producer<CloseableReference<CloseableImage>> getNetworkFetchSequence() { if (mNetworkFetchSequence == null) { mNetworkFetchSequence =
     newBitmapCacheGetToDecodeSequence(getCommonNetworkFetchToEncodedMemorySequence());
    
    } return mNetworkFetchSequence; }</pre>

    先看紅色代碼, getCommonNetworkFetchToEncodedMemorySequence 它也是返回一個Producer (可粗略看)

      /**
  • multiplex -> encoded cache -> disk cache -> (webp transcode) -> network fetch. */ private synchronized Producer<EncodedImage> getCommonNetworkFetchToEncodedMemorySequence() { if (mCommonNetworkFetchToEncodedMemorySequence == null) { Producer<EncodedImage> inputProducer =
     newEncodedCacheMultiplexToTranscodeSequence(
         mProducerFactory.newNetworkFetchProducer(mNetworkFetcher));
    
    mCommonNetworkFetchToEncodedMemorySequence =
     ProducerFactory.newAddImageTransformMetaDataProducer(inputProducer);
    
    if (mResizeAndRotateEnabledForNetwork && !mDownsampleEnabled) { mCommonNetworkFetchToEncodedMemorySequence =
       mProducerFactory.newResizeAndRotateProducer(
           mCommonNetworkFetchToEncodedMemorySequence);
    
    } } return mCommonNetworkFetchToEncodedMemorySequence; }</pre>

    再看, newEncodedCacheMultiplexToTranscodeSequence 它也是返回一個Producer (可粗略看)

    </div>

    來自: http://www.cnblogs.com/chiefhsing/p/5125950.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!