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版权协议,转载请附上原文出处链接和本声明。