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