Handler延迟加载机制

  • Post author:
  • Post category:其他


发送一条延迟消息比如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 版权协议,转载请附上原文出处链接和本声明。