简介
Handler是线程间通讯的载体,它通过异步操作将Message事务入队到目标线程的消息队列中,最终目标线程通过出队列的方式处理传递过来的Message事务,从而实现线程间通讯
这里我们将生产Message事务的线程称为生产者线程,处理Message事务的线程称为消费者线程
源码流程分析

从类图关系中,我们可以看到
1.Looper构建了消息队列MessageQueue
2.Message的成员target关联Handler
3.Handler的成员mQueue关联MessageQueue,成员mLooper关联Looper
4.MessageQueue的成员mMessages关联Message
消费者线程
首先我们创建消费者线程并启动消息循环
这里我们借助HandlerThread类1
2HandlerThread consumerThread = new HandlerThread("Consumer");
consumerThread.start();
我们分析下HandlerThread的类实现
首先查看继承关系1
public class HandlerThread extends Thread
由继承关系中,可以得知该类属于线程类
然后查看线程类的执行体run函数1
2
3
4
5
6public void run() {
......
Looper.prepare(); //初始化当前线程的Looper
Looper.loop(); //启动消息循环
......
}
到关键点了,接下来我们分别分析prepare和loop中干了什么
1. Looper.prepare
1 | public static void prepare() { |
sThreadLocal与C++的TLS功能一样,具有一键多值属性:既同一个对象保存不同线程的局部变量
Looper构造函数1
2
3
4private Looper(boolean quitAllowed) {
mQueue = new MessageQueue(quitAllowed); //创建消息队列
mThread = Thread.currentThread(); //记录消费者线程
}
由于此篇文章只说Java实现部分,而MessageQueue类涉及到native部分,此部分会在Native篇中详细讲解,因此这里不具体进行分析,这里读者只需知道创建了消息队列MessageQueue即可
总结
1.消费者线程创建了Looper以及消息队列MessageQueue
2.Looper与消费者线程通过sThreadLocal进行唯一绑定
2. Looper.loop
1 | public static void loop() { |
2.1 MessageQueue.next
1 | Message next() { |

出队列流程图
2.2 Handler.dispatchMessage
1 | public void dispatchMessage(Message msg) { |
注1:此处callback一般在Handler.post(Runnable)中设置
注2:此处callback在Handler构造函数中设置1
public Handler(Looper looper, Callback callback)
总结
1.调用Looper.loop使消费者线程不断循环从消息队列MessageQueue中拿到Message事务并进行处理
2.如果消息队列MessageQueue为空,则遍历执行空闲Handler事务
3.如果消息队列MessageQueue以及空闲Handler都为空,则消费者线程进行休眠等待
生产者线程将Message事务入队列并唤醒消费者线程
4.Message事务处理优先级: Message.callback > Handler.mCallback > Self(handleMessage)
生产者线程
首先我们创建生产者线程并通过Handler的sendEmptyMessage接口将事务Message入队到消费者线程的消息队列MessageQueue中1
2
3
4
5
6
7
8
9
10
11
12
13new Thread("Producer") {
public void run() {
/* 创建Handler并关联消费者线程的消息队列MessageQueue */
Handler producerHandler = new Handler(consumerThread.getLooper()) {
public void handleMessage(Message msg) {
}
};
/* 将Message事务入队到关联的消息队列,最终调用MessageQueue.enqueueMessage */
producerHandler.sendEmptyMessage(0);
}
};
Handler构造函数1
2
3
4
5
6
7
8
9public Handler(Looper looper) {
this(looper, null, false);
}
public Handler(Looper looper, Callback callback, boolean async) {
......
mLooper = looper; //成员mLooper关联消费者线程的looper
mQueue = looper.mQueue; //成员mQueue关联消费者线程的消息队列MessageQueue
......
}
MessageQueue.enqueueMessage
1 | boolean enqueueMessage(Message msg, long when) { |

入队列流程图
总结
1.生产者线程创建Handler,该Handler关联消费者线程的消息队列MessageQueue
2.生产者线程通过该Handler发送Message,将Message事务入队到关联的消息队列MessageQueue中,
等待消费者线程进行处理
全文总结

1.消费者线程启动消息循环,不断处理消息队列中的事务
2.生产者线程通过调用Handler的sendMessage接口,将Message事务入队到消息队列MessageQueue中
3.消费者线程从消息队列MessageQueue中取出Message事务,进行处理
本章完