以下代码笔记基于 commitId:12652d2fd80c54df43c90e57ccd16998779c3d95,commit 时间:2013/2/20 10:26 AM。点击上面的 commitId 可以跳转到 github 看代码,配合本文阅读。
本系列的文章结构包括以下 5 个部分。重构 是同样功能的代码的变动。feature 是对比上次提交,这次提交的新功能。设计 是我觉得可以提一下的代码设计,这部分可能不同的程序员会做不同的设计。疑惑 是我看代码过程中觉得有问题或者不懂的地方。知识点 是关于 Java 或者安卓的一些通用知识。
feature
给非 ImageView 的情况,提供一种特殊的请求
考虑到有些情况获取图片不是要在 ImageView 中显示,这里提供一种特殊的请求。在 Request.java 的 Bitmap get()
方法里,生成了一个没有设置 ImageView 的 request 对象,然后直接调用 picasso 的 run
方法。这次提交把 run
方法改成了返回 bitmap 对象。注意这里没有把这个任务提交到线程池,所以这个方法是同步耗时的,如果要网络下载且下载比较久,就会造成阻塞。由于主线程不能发起网络请求,所以这个方法不能在主线程调用。
设计
判断是否在主线程,不在则报错
上面说的 Request.java 的 Bitmap get()
方法,不能在主线程调用,所以这个方法的第一句可以先判断是否在主线程,如果不在则报错。具体的判断方法是 Picasso.java 的 checkNotMain
方法。
更小范围的 try catch
这个可以看 Picasso.java 的 loadFromCaches(Request request)
方法,本来只是一个大的 try catch ,改成了几个粒度更小的 try catch ,每次 catch 后再打印对应的错误信息,便于调试。
知识点
String 拼接
String 拼接可以用 String.format("xxxx %d", 1) 来生成固定格式的字符串。
如何判断是否在主线程
主线程有一个 Looper ,这个 Looper 可以拿到主线程的对象,这样就可以比较当前线程是否为主线程。具体代码如下:Looper.getMainLooper().getThread() == Thread.currentThread()