美文网首页
Picasso 源码分析:BitmapHunter

Picasso 源码分析:BitmapHunter

作者: linheimx | 来源:发表于2016-08-25 17:11 被阅读59次

Bitmap猎人

这个名字起哦真是形象:专为搜寻Bitmap的猎人。

Paste_Image.png

BitmapHunter 从哪里来?

还记得action被分发,被执行的地方么?

void performSubmit(Action action, boolean dismissFailed) {
------
        hunter = forRequest(action.getPicasso(), this, cache, stats, action);// create
        hunter.future = service.submit(hunter);// 执行
        hunterMap.put(action.getKey(), hunter);// 该搜寻任务,记录在案!
-----
}

hunter的构造:

Paste_Image.png

只要Picasso中有一个RequestHandler能处理 该request的,就利用该handler来构建 BitmapHunter!

Picasso提供的RequestHandler:

Paste_Image.png

RequestHandler这个抽象类

Paste_Image.png

它的一些实现类:

Paste_Image.png

一些RequestHandler具体的 对请求能否处理的实现:

能否处理这个请求:注意根据请求的uri所采用的协议来实现的。

  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具体的 对请求的资源加载的实现:

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

有意思的是:对网络图片的加载 Picasso抽象了一个Downloader
具体的加载由OkHttp来实现的:

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

相关文章

  • Picasso 源码分析:BitmapHunter

    Bitmap猎人 这个名字起哦真是形象:专为搜寻Bitmap的猎人。 BitmapHunter 从哪里来? 还记得...

  • Picasso源码阅读笔记

    一、Picasso简介 Picasso是Square出品的图片下载、缓存库。 二、Picasso源码分析 使用示例...

  • Glide源码(一)

    Picasso,Glide,Fresco对比 上一篇我们分析了Picasso,这一篇我们来分析Glide源码的调用...

  • Picasso中的多线程

    Picasso的使用及源码提交请求流程网上都已经很多了,本篇只分析Picasso中多线程相关 Picasso的线程...

  • Picasso源码分析

    Picasso是一个由Square公司开源的强大的Android图片下载缓存库,仅仅只需要一行代码就可以实现图片的...

  • Picasso源码分析

    涉及到的设计模式1.单例2.Builder3.责任链模式 private Downloader downloade...

  • Picasso源码分析

    一 介绍 Square公司开源的图片加载库。优点是功能还算完善,能满足基本的图片加载需求,使用简单,体量轻易推倒。...

  • Picasso源码分析

  • Picasso源码分析

    源码基于Picasso 2.5.2。 一,概括 从Picasso最简单的调用来一观Picasso的整体流程。给个图...

  • Picasso源码完全解析(二)--Picasso实例的创建

    Picasso源码完全解析(一)--概述 Picasso源码完全解析(二)--Picasso实例的创建 Picas...

网友评论

      本文标题:Picasso 源码分析:BitmapHunter

      本文链接:https://www.haomeiwen.com/subject/kprasttx.html