You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1.6 KiB
1.6 KiB
Handler 的消息延时是怎么实现的?
- 消息延时是做了什么特殊处理?
- 是发送延时了,还是消息延时处理了?
- 延时精度怎么样?
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;
return enqueueMessage(queue, msg, uptimeMillis);
}
boolean enqueueMessage(Message msg, long when){
msg.when = when;
Message p = mMessage, prew;
if(p==null||when==0||when<p.when){
msg.mext = p;
mMessage = msg;
}else{
for(;;){
prew = p;
p = p.next;
if(p==null||when<p.when){
break;
}
}
msg.next = p;
prev.next = msg;
}
nativeWake(mPtr);
}
Message next(){
for(int nextPollTimeoutMillis = 0;;){
nativePollOnce(ptr, nextPollTimeoutMillis);
final long now = SystemClock.uptimeMillis();
Message msg = mMessages;
if(msg != null){
if(now<msg.when){
nextPollTimeoutMillis = (int)Math.min(msg.when-now, Integer.MAX_VALUE);
}else{
mMessage = msg.next;
msg.next = null;
return msg;
}
}else{
nextPollTimeoutMillis = -1;
}
}
}
总结
- 消息队列按消息触发时间排序
- 设置 epoll_wait 的超时时间,使其在特定时间唤醒
- 关于延时精度