以下代码笔记基于 commitId:8695e86e3f3aad9d2b3b0ccceaab9b143a67e55f,commit 时间:2013/2/21, 3:24 AM。点击上面的 commitId 可以跳转到 github 看代码,配合本文阅读。
本系列的文章结构包括以下 6 个部分。重构 是同样功能的代码的变动。fix 是修复的 bug 。 feature 是对比上次提交,这次提交的新功能。设计 是我觉得可以提一下的代码设计,这部分可能不同的程序员会做不同的设计。疑惑 是我看代码过程中觉得有问题或者不懂的地方。知识点 是关于 Java 或者安卓的一些通用知识。
这个修复了 commit 日记(5) 里面我提出的疑惑。
if (placeholderResId != 0) { throw new IllegalArgumentException("Placeholder image resource invalid."); } 改成了 if (placeholderResId == 0) { throw new IllegalArgumentException("Placeholder image resource invalid."); } 复制代码
上个版本 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(); 复制代码
可以看到变得易读了一点。
这次提交我们新增了一个图片去处,Picasso 把这个抽象成一个接口: Target。任何实现了这个接口的类,都可以接收图片。然后只需要在 Builder 里新增一个接收 Target 参数的 into 方法,如果调用 into(imgView) 就会生成 Request 对象,如果调用 into(target) 就会生成 TargetRequest 对象。