【Android】Fresco图片加载框架(二) - Producer

jopen 9年前

  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;    }

先看红色代码, 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;    }

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

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