发送一条延迟消息比如handler.sendMessageDelayed的流程:
1、
public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
2、
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);
}
3、
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;//将handler赋值给msg
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
前面的这三步比较好理解
1、发送一个延迟消息,延迟时间和当前时间相加计算出消息发送时间
2、获取当前消息队列,根据消息发送时间进行排序
3、调用消息队列中的排序方法进行排序
4、我们看一下具体的排序:
boolean enqueueMessage(Message msg, long when) {
if (msg.target == null) {
throw new IllegalArgumentException("Message must have a target.");
}
if (m
版权声明:本文为qq_40667603原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。