Android开发

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

本文主要是介绍Picasso 源码 commit 日记(6):利用继承新增 TargetRequest,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

以下代码笔记基于 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 对象。

这篇关于Picasso 源码 commit 日记(6):利用继承新增 TargetRequest的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!