Handler的postDelayed流程

Handler的post系列方法用来执行一个线程。

比如:

mhandler.postDelayed(runnable, 1000);

Handler的postDelayed方法其实也是通过sendMessageDelayed方法实现的。

public final boolean postDelayed(Runnable r, long delayMillis)
{
    return sendMessageDelayed(getPostMessage(r), delayMillis);
}

Runnable参数经过getPostMessage方法封装成一个Message。

private static Message getPostMessage(Runnable r) {
    Message m = Message.obtain();
    m.callback = r;
    return m;
}

sendMessageDelayed方法会对延迟时间进行处理,即当前时间加延迟的时间,就是这个消息需要执行的时间了。SystemClock.uptimeMillis()表示从开机到现在的毫秒数

public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
    if (delayMillis < 0) {
        delayMillis = 0;
    }
    return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}

之后调用MessageQueue的enqueueMessage方法,传入此Message和延迟时间。将此消息插入消息队列中。参数wen即为传入的延迟时间。

boolean enqueueMessage(Message msg, long when) {}

最后Looper通过调用MessageQueue的next方法从消息队列中取出消息。

在MessageQueue的next方法中,会判断当前时间是否小于延长时间,如果小于,则计算出剩余时间,调用nativePollOnce(ptr, nextPollTimeoutMillis)进行阻塞。

Message next() {
    for (;;) {
        nativePollOnce(ptr, nextPollTimeoutMillis);
        synchronized (this) {
            if (msg != null) {
                if (now < msg.when) {
                    nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE);
                } 
            }
    }
}

 


版权声明:本文为longge33445原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。