Picasso 源码 commit 记(4):如何判断是否在主线程?

198 阅读2分钟

以下代码笔记基于 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()