前记
Android 中无法在子线程中直接更新 UI,通过 Handler 提供的消息处理函数可以实现子线程 UI 更新。那么 Handler 究竟是啥。Handler 这货其实和 Looper 有一腿,即使平常在使用 Handler 的时候不用直接引用 Looper,但是,但是,但是,相信他们没办法切断这姻缘。
Android 的消息驱动模型
Android 同大都数系统相同,使用基于消息驱动的模型。即由事件源(用户点击按钮、滑动列表 etc.)产生消息并投递到消息队列,消息处理器取出消息并进行分发、处理。
窥窃 Looper
好了,有了消息驱动模型的概念,现在开始主题。即使你有多不情愿了解 Looper,但还是从这里开始吧。
简单来讲,Looper 中维护一个消息队列,消息被投递到消息队列当中,并由 Looper 实现消息分发。
先来看一个 Looper 使用的例子:
class Fuck extends Thread {
@Override
public void run() {
// 投递消息前需要调用该函数
Looper.prepare();
// 投递消息到 Looper...
// 分发、处理消息
Looper.loop();
}
}
翻开 android.os.Looper.java,我们对四个变量感兴趣:
public final class Looper {
...
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
private static Looper sMainLooper;
final MessageQueue mQueue;
final Thread mThread;
...
}
- ThreadLocal ThreadLocal 是 Java 提供的一个类,可以关联(保存和读取)一个当前线程的变量,其他线程无法跨越线程对该变量进行访问,具体参考 Oracle 文档。
- Looper 应用程序主线程(即 UI 进程)的 Looper 实例(找到真面目www)。
- MessageQueu