Handler主要是对外提供消息发送和接收的接口,就是sendMessage(Message msg),dispatchMessage(Message msg),handlerMessage(Message msg)这三个函数。
消息队列其实就是Hanlder和Looper进行通信的纽带,通信的管子。
当调用sendMessage函数时,其实是向消息队列添加了一条消息。
调用dispatchMessage函数时,其实是从消息队列中取出了一条消息进行处理。
Looper则启动了一个循环,在不停的检测有没有消息到了,如果有消息到来就调用Handler的dispatchMessage函数进行处理。
消息发送之后由谁处理,主要就是看发送的这个消息是怎么构成的,在dispatchMessage函数中会看到具体的处理过程。
dispatchMessage ---- 消息处理函数,不用外部进行显式的调用,Looper会在收到消息的时候会自动调用
在调用handler的dispatchMessage函数时,根据不同的条件会调用不同的函数,而且也有优先级
如果msg.callback == null,且mCallback == null,则由Handler自身的handleMessage()来处理。
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);//需要重写handleMessage函数。
}
}
对msg.callback进行赋值
public static Message obtain(Message orig) {
Message m = obtain();
m.what = orig.what;
m.arg1 = orig.arg1;
m.arg2 = orig.arg2;
m.obj = orig.obj;
m.replyTo = orig.replyTo;
if (orig.data != null) {
m.data = new Bundle(orig.data);
}
m.target = orig.target;
m.callback = orig.callback;
return m;
}