再次看Handler源码有了新的理解和认识,个人总结的可能有不当之处。
一、Message主要的几个常见属性是what、object、arg1,这几个是在使用时常遇到的,还有几个源码级的属性when(long)、target(Handler)、next(Message),这几个属性关联到四兄弟的工作机制。
首先when是接收handler.sendMessageDelay的delay时间的,一步一步跟进去最终将delay+uptimeMillis赋值给when,而next是Mesaage类型也说明了Message是一个链表结构,便于队列排序:
以sendEmptyMessageDelayed为例
public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {
Message msg = Message.obtain();
msg.what = what;
return sendMessageDelayed(msg, delayMillis);
}
里面其实也是调用的sendMessageDelayed,只是消息只给了what赋值,
public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
在Handler中最后调用的是MessageQueue中的enqueueMessage方法,将延迟时间传入。然后看MessageQueue中代码:
boolean enqueueMess