Picasso 源碼分析:BitmapHunter

Bitmap獵人

這個名字起哦真是形象:專為搜尋Bitmap的獵人。

Paste_Image.png

BitmapHunter 從哪里來?

還記得action被分發(fā),被執(zhí)行的地方么?

void performSubmit(Action action, boolean dismissFailed) {
------
        hunter = forRequest(action.getPicasso(), this, cache, stats, action);// create
        hunter.future = service.submit(hunter);// 執(zhí)行
        hunterMap.put(action.getKey(), hunter);// 該搜尋任務,記錄在案!
-----
}

hunter的構造:

Paste_Image.png

只要Picasso中有一個RequestHandler能處理 該request的,就利用該handler來構建 BitmapHunter!

Picasso提供的RequestHandler:

Paste_Image.png

RequestHandler這個抽象類

Paste_Image.png

它的一些實現(xiàn)類:

Paste_Image.png

一些RequestHandler具體的 對請求能否處理的實現(xiàn):

能否處理這個請求:注意根據(jù)請求的uri所采用的協(xié)議來實現(xiàn)的。

  1. NetworkRequestHandler
@Override public boolean canHandleRequest(Request data) {
    String scheme = data.uri.getScheme();
    return (SCHEME_HTTP.equals(scheme) || SCHEME_HTTPS.equals(scheme));
  }
  1. FileRequestHandler
  @Override public boolean canHandleRequest(Request data) {
    return SCHEME_FILE.equals(data.uri.getScheme());
  }
  1. AssetRequestHandler
@Override public boolean canHandleRequest(Request data) {
    Uri uri = data.uri;
    return (SCHEME_FILE.equals(uri.getScheme())
        && !uri.getPathSegments().isEmpty() && ANDROID_ASSET.equals(uri.getPathSegments().get(0)));
  }

一些RequestHandler具體的 對請求的資源加載的實現(xiàn):

  1. NetworkRequestHandler
Paste_Image.png
  1. FileRequestHandler
Paste_Image.png
  1. AssetRequestHandler
Paste_Image.png

有意思的是:對網(wǎng)絡圖片的加載 Picasso抽象了一個Downloader
具體的加載由OkHttp來實現(xiàn)的:

Paste_Image.png

他是一個Runnable

直接 run

Paste_Image.png

hunt():

Bitmap hunt() throws IOException {
        Bitmap bitmap = null;
      
        // 1. load bitmap from memery
        if (shouldReadFromMemoryCache(memoryPolicy)) {
            bitmap = cache.get(key);
            if (bitmap != null) {
                stats.dispatchCacheHit();
                loadedFrom = MEMORY;
                if (picasso.loggingEnabled) {
                    log(OWNER_HUNTER, VERB_DECODED, data.logId(), "from cache");
                }
                return bitmap;
            }
        }

        // 2. load from requestHandler
        data.networkPolicy = retryCount == 0 ? NetworkPolicy.OFFLINE.index : networkPolicy;
        RequestHandler.Result result = requestHandler.load(data, networkPolicy);
        if (result != null) {
            loadedFrom = result.getLoadedFrom();
            exifOrientation = result.getExifOrientation();
            bitmap = result.getBitmap();

            // If there was no Bitmap then we need to decode it from the stream.
            if (bitmap == null) {
                InputStream is = result.getStream();
                try {
                    bitmap = decodeStream(is, data);
                } finally {
                    Utils.closeQuietly(is);
                }
            }
        }

        if (bitmap != null) {
            if (picasso.loggingEnabled) {
                log(OWNER_HUNTER, VERB_DECODED, data.logId());
            }
            stats.dispatchBitmapDecoded(bitmap);
            if (data.needsTransformation() || exifOrientation != 0) {
                synchronized (DECODE_LOCK) {
                    if (data.needsMatrixTransform() || exifOrientation != 0) {
                        bitmap = transformResult(data, bitmap, exifOrientation);
                        if (picasso.loggingEnabled) {
                            log(OWNER_HUNTER, VERB_TRANSFORMED, data.logId());
                        }
                    }
                    if (data.hasCustomTransformations()) {
                        bitmap = applyCustomTransformations(data.transformations, bitmap);
                        if (picasso.loggingEnabled) {
                            log(OWNER_HUNTER, VERB_TRANSFORMED, data.logId(), "from custom transformations");
                        }
                    }
                }
                if (bitmap != null) {
                    stats.dispatchBitmapTransformed(bitmap);
                }
            }
        }

        return bitmap;
    }

requestHandler 是什么?

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容