Android Handler 机制的简单理解
简述
创建一个 Message 对象,然后借助 Handler 发送出去,之后在 Handler 的 handleMessage() 方法中获取刚才发送的 Message 对象。
在子线程更新 UI
- Handler
- Activity.runOnUiThread()
- View.post(Runnable r)
Handler 主要由以下部分组成
Handler Handler 是一个消息辅助类,主要负责向消息池发送各种消息事件 Handler.sendMessage() 和处理相应的消息事件 Handler.handleMessage()。
Message Message 即消息,它能容纳任意数据,相当于一个信息载体。
MessageQueue MessageQueue 如其名,消息队列。它按时序将消息插入队列,最小的时间戳将被优先处理。
Looper Looper 负责从消息队列读取消息,然后分发给对应的 Handler 进行处理。它是一个死循环,不断地调用 MessageQueue.next() 去读取消息,在没有消息分发的时候会变成阻塞状态,在有消息可用时继续轮询。
Looper.prepare();
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i(TAG, "在子线程中定义Handler,并接收到消息。。。");
}
};
Looper.loop();
// 1. 创建 HandlerThread 并准备 Looper
handlerThread = new HandlerThread("myHandlerThread");
handlerThread.start();
// 2. 创建 Handler 并绑定 handlerThread 的 Looper
new Handler(handlerThread.getLooper()).post(new Runnable() {
@Override
public void run() {
// 注意:Handler 绑定了子线程的 Looper,这个方法也会运行在子线程,不可以更新 UI
MLog.i("Handler in " + Thread.currentThread().getName());
}
});
// 3. 退出
@Override public void onDestroy() {
super.onDestroy();
handlerThread.quit();
}
- 使用 post 方法提交任务,postAtFrontOfQueue() 将任务加入到队列前端, postAtTime() 指定时间提交任务, postDelayed() 延后提交任务。
- 使用 sendMessage() 方法可以发送消息,sendMessageAtFrontOfQueue() 将该消息放入消息队列前端,sendMessageAtTime() 指定时间发送消息, sendMessageDelayed() 延后提交消息。
HandlerThread 的 quit() 和 quitSafety() 区别
两个方法作用都是结束 Looper 的运行。它们的区别是:quit() 方法会直接移除 MessageQueue 中的所有消息,然后终止 MesseageQueue,而 quitSafety() 会将 MessageQueue 中已有的消息处理完成后(不再接收新消息)再终止 MessageQueue。