Handler是主要的任务是,往Looper里面的消息队列插入消息,当消息被执行时,Handler对应的CallBack就会被执行。
Handler有5个主要数据成员,和2个核心函数
mLooper
该Handler所对应的线程的Looper,该Looper是该Handler独有的。
mQueue
上面的Looper所拥有的消息队列
mCallback
如果mCallback被设置,那么mCallback.handleMessage(Message message)会被执行;如果mCallback为null,那么Handler的handleMessage(Message message)会被执行。
mAsynchronous
如果mAsynchronous为true,那么Handler插入的消息就是异步的。
mMessenger
Handler内部实现的一个信鸽(Bindler),适用于跨进程通讯。
enqueueMessage
将消息插入到消息队列中去,设置target和是否异步。
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
dispatchMessage
如果消息有Runnable,那么先执行Runnable的run(),如果Handler的CallBack不为空,且mCallback.handleMessage(msg)消耗了消息(返回true)那么Handler自身的handleMessage(msg)就不会执行,否则,接着执行handleMessage(msg)。
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
网友评论