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)的。
- NetworkRequestHandler
@Override public boolean canHandleRequest(Request data) {
String scheme = data.uri.getScheme();
return (SCHEME_HTTP.equals(scheme) || SCHEME_HTTPS.equals(scheme));
}
- FileRequestHandler
@Override public boolean canHandleRequest(Request data) {
return SCHEME_FILE.equals(data.uri.getScheme());
}
- 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):
- NetworkRequestHandler

Paste_Image.png
- FileRequestHandler

Paste_Image.png
- 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 是什么?