Picasso 源码 commit 记(6):利用继承新增 TargetRequest

392 阅读2分钟

以下代码笔记基于 commitId:8695e86e3f3aad9d2b3b0ccceaab9b143a67e55f,commit 时间:2013/2/21, 3:24 AM。点击上面的 commitId 可以跳转到 github 看代码,配合本文阅读。

本系列的文章结构包括以下 6 个部分。重构 是同样功能的代码的变动。fix 是修复的 bug 。 feature 是对比上次提交,这次提交的新功能。设计 是我觉得可以提一下的代码设计,这部分可能不同的程序员会做不同的设计。疑惑 是我看代码过程中觉得有问题或者不懂的地方。知识点 是关于 Java 或者安卓的一些通用知识。

fix

修复检测 resId 参数出错

这个修复了 commit 日记(5) 里面我提出的疑惑。

if (placeholderResId != 0) {
    throw new IllegalArgumentException("Placeholder image resource invalid.");
}
改成了
if (placeholderResId == 0) {
    throw new IllegalArgumentException("Placeholder image resource invalid.");
}

feature

支持非 ImageView 、可以在主线程使用的 Request

上个版本 Picasso 加载的图片有两个去处:一个是通过 Request 和 handler 配合,加载成功后在 ImageView 中显示;一个是通过 Request 的 get() 方法在非主线程拿到 bitmap 对象。这次提交想新增一个图片的去处:在主线程拿到 bitmap 对象,但不是直接设置给 ImageView 。

这个要怎么实现的呢?简单分析一下,这个需求和现有的 Request 功能其实差不多,区别在于图片加载成功后不是设置给 ImageView ,而是返回 bitmap 对象。所以可以通过 继承 重用 Request 的大部分功能,通过 重写 改掉图片加载成功后的处理。这个可以看 TargetRequest.java 文件。

设计

功能划分

commit 日记(3) 中,我疑惑为什么要把为什么工作逻辑要放到 Picasso.java 里面?这让 handler 里面的代码有点绕。这次为了 TargetRequest 可以重写图片加载成功后的处理,所以把加载成功后调用的 complete 方法从 Picasso.java 迁移到了 Request.java 里。做了这个改动后,可以再看一下 handler 里面的代码:

request.picasso.complete(request);
变成了
request.complete();

可以看到变得易读了一点。

优雅地增加图片去处 API

这次提交我们新增了一个图片去处,Picasso 把这个抽象成一个接口: Target。任何实现了这个接口的类,都可以接收图片。然后只需要在 Builder 里新增一个接收 Target 参数的 into 方法,如果调用 into(imgView) 就会生成 Request 对象,如果调用 into(target) 就会生成 TargetRequest 对象。