以下代码笔记基于 commitId:aef01ed7565a88392e4bb32d8deb986aab6d0177,commit 时间:2013/2/21, 12:53 AM。点击上面的 commitId 可以跳转到 github 看代码,配合本文阅读。
本系列的文章结构包括以下 5 个部分。重构 是同样功能的代码的变动。feature 是对比上次提交,这次提交的新功能。设计 是我觉得可以提一下的代码设计,这部分可能不同的程序员会做不同的设计。疑惑 是我看代码过程中觉得有问题或者不懂的地方。知识点 是关于 Java 或者安卓的一些通用知识。
重构
抽取成 Utils 类
由于 Picasso.java checkNotMain
方法在几个地方都有用到,所以把它抽取成工具类里的静态方法。
final class Utils {
static void checkNotMain() {
if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
throw new IllegalStateException("Method call should not happen from the main thread.");
}
}
private Utils() {
// No instances.
}
}
优化代码可读性
for (Iterator<Entry> i = lruEntries.values().iterator(); i.hasNext(); )
改成了
Iterator<Entry> i = lruEntries.values().iterator();
while (i.hasNext())
Map.Entry<String, Entry> toEvict = lruEntries.entrySet().iterator().next();
remove(toEvict.getKey());
改成了
remove(lruEntries.entrySet().iterator().next().getKey());
import static com.squareup.picasso.external.DiskLruCache.open;
diskLruCache = open(directory, 1, 1, maxSize);
改成了
diskLruCache = DiskLruCache.open(directory, 1, 1, maxSize);
一些变量提升成类静态常量,常量名字改成大写
private static final Handler handler
里面handler
改成了HANDLER
。this.retryCount = 2;
改成了this.retryCount = DEFAULT_RETRY_COUNT;
。声明了一个静态常量DEFAULT_RETRY_COUNT = 2
。
不需要 getter 和 setter 封装。
把 Request.java 里面的很多 getter 和 setter 方法都取消了,改成直接访问 Request.java 的成员变量。例如
existing.getFuture().cancel(true); // 笔者注:existing 是一个 request
改成了
existing.future.cancel(true);
注意 Request.java 里面的这些成员变量是 protected 的,所以属于包内可见。
feature
可以配置 error drawable
这个和 commit 日记(2) 写的配置 placeHolder 差不多。
疑惑
placeholderResId 检测出错
在 Builder 里用 placeholderResId 设置 placeholder 的方法里,先检测了如果 placeholderResId != 0
,则报错。这里应该检测 placeholderResId <= 0
吧?正确的 placeholderResId 应该是大于 0 的。
public Builder placeholder(int placeholderResId) {
if (placeholderResId != 0) {
throw new IllegalArgumentException("Placeholder image resource invalid.");
}
}
知识点
如何写一个严谨的工具类
注意本文一开头的工具类的一些细节: final class 、private contructor 。