Handler
Handler 主要用于在不同的线程中相互通信,使用场景最多的应该就是在子线程中更新 UI。
与 Handler 相关的类:
Handler:处理与发送消息(Message)
Message:消息的包装类
Looper:整个 Handler 通信的核心,接受 Handler 发送的 Message,循环遍历 MessageQueue 中的 Message,并发送至 Handler 处理
MessageQueue:保存 Message
LocalThread:存储 Looper 与 Looper所在线程的信息
关系流程图:
上图简单概括为:Handler 将 Message post 或者 send 到 MessageQueue 中,Looper 不断循环从 MessageQueue 中取出 Message 交由 Handler 来处理。
Handler 消息处理
Handler 处理消息的方法为 dispatchMessage:
/**
* Handle system messages here.
*/
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
①判断 Message.callback 是否为空,不为空则交给 callback 处理;
②判断 Handler.callback 是否为空,不为空则调用 mCallback.handleMessage(msg) 处理;
③如果前面都为空,则调用 Handler.handleMessage(msg) 方法处理。
所以我们可以通过重写 dispatchMessage方法来改变这种默认的消息分发顺序。
一般来说,我们都是按照如下的方式使用 Message
Message message = mHandler.obtainMessage();
message.what = 0;
message.obj = "123";
mHandler.sendMessage(message);
我们很少在 Message 中使用 callback,那么 这个 callback究竟又是什么?
Handler 消息发送
post 方式
刚刚说到,Handler 发送 Message 有两类方法:post 和 send 。其中最常用的就是 send 方法了,下面来看一个使用 post 的例子:
mHandler.post(new Runnable() {
@Override
public void run() {
//do something
}
});
打开 post(Runnable) 方法:
public final boolean post(Runnable r){
return sendMessageDelayed(getPostMessage(r), 0);
}
其中把 Runnable 参数通过 getPostMessage() 方法包装成了 Message 消息,然后继续使用 send 方式发送到 MessageQueue 中去。
那么继续打开 getPostMessage 方法:
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callba