概述
Handler是Android消息机制的上层接口。通过它可以轻松地将一个任务切换到Handler所在的线程中去执行。通常情况下,Handler的使用场景就是 更新UI
。
Handler的使用
在子线程中,进行耗时操作,执行完操作后,发送消息,通知主线程更新UI。
public class Activity extends android.app.Activity {
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 更新UI
}
}
;
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
// 执行耗时任务 ...
// 任务执行完后,通知Handler更新UI
Message message = Message.obtain();
message.what = 1;
mHandler.sendMessage(message);
}
}
).start();
}
}
Handler架构
Handler消息机制主要包括: MessageQueue
、 Handler
、 Looper
这三大部分,以及 Message
。
- Message:需要传递的消息,可以传递数据;
- MessageQueue:消息队列,但是它的内部实现并不是用的队列,而是通过单链表的数据结构来维护消息列表,因为单链表在插入和删除上比较有优势。主要功能是向消息池投递消息(
MessageQueue.enqueueMessage
)和取走消息池的消息(MessageQueue.next
)。 - Handler:消息辅助类,主要功能是向消息池发送各种消息事件(
Handler.sendMessage
)和处理相应消息事件(Handler.handleMessage
); - Looper:消息控制器,不断循环执行(
Looper.loop
),从MessageQueue中读取消息,按分发机制将消息分发给目标处理者。
从上面的类图可以看出:
- Looper有一个MessageQueue消息队列;
- MessageQueue有一组待处理的Message;
- Message中记录发送和处理消息的Handler;
- Handler中有Looper和MessageQueue。
MessageQueue、Handler和Looper三者之间的关系: 每个线程中只能存在一个Looper,Looper是保存在ThreadLocal中的。 主线程(UI线程)已经创建了一个Looper,所以在主线程中不需要再创建Looper,但是在其他线程中需要创建Looper。 每个线程中可以有多个Handler,即一个Looper可以处理来自多个Handler的消息。 Looper中维护一个MessageQueue,来维护消息队列,消息队列中的Message可以来自不同的Handler。
Handler的运行流程
在子线程执行完耗时操作,当Handler发送消息时,将会调用 MessageQueue.enqueueMessage
,向消息队列中添加消息。 当通过 Looper.loop
开启循环后,会不断地从消息池中读取消息,即调用 MessageQueue.next
, 然后调用目标Handler(即发送该消息的Handler)的 dispatchMessage
方法传递消息, 然后返回到Handler所在线程,目标Handler收到消息,调用 handleMessage
方法,接收消息,处理消息。
源码分析
在子线程创建Handler
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
}
;
Looper