【Android】Fresco圖片加載框架(二) - Producer
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 =
} return mNetworkFetchSequence; }</pre>newBitmapCacheGetToDecodeSequence(getCommonNetworkFetchToEncodedMemorySequence());
先看紅色代碼, getCommonNetworkFetchToEncodedMemorySequence , 它也是返回一個Producer (可粗略看) :
/**
- multiplex -> encoded cache -> disk cache -> (webp transcode) -> network fetch.
*/
private synchronized Producer<EncodedImage> getCommonNetworkFetchToEncodedMemorySequence() {
if (mCommonNetworkFetchToEncodedMemorySequence == null) {
Producer<EncodedImage> inputProducer =
mCommonNetworkFetchToEncodedMemorySequence =newEncodedCacheMultiplexToTranscodeSequence( mProducerFactory.newNetworkFetchProducer(mNetworkFetcher));
if (mResizeAndRotateEnabledForNetwork && !mDownsampleEnabled) { mCommonNetworkFetchToEncodedMemorySequence =ProducerFactory.newAddImageTransformMetaDataProducer(inputProducer);
} } return mCommonNetworkFetchToEncodedMemorySequence; }</pre>mProducerFactory.newResizeAndRotateProducer( mCommonNetworkFetchToEncodedMemorySequence);
再看, newEncodedCacheMultiplexToTranscodeSequence , 它也是返回一個Producer (可粗略看) :
</div>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!