parent
8130b89644
commit
4dc96160d4
@ -0,0 +1,63 @@ |
||||
--- |
||||
Handler 的消息延时是怎么实现的? |
||||
--- |
||||
|
||||
1. 消息延时是做了什么特殊处理? |
||||
2. 是发送延时了,还是消息延时处理了? |
||||
3. 延时精度怎么样? |
||||
|
||||
```java |
||||
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; |
||||
} |
||||
} |
||||
} |
||||
``` |
||||
|
||||
#### 总结 |
||||
|
||||
1. 消息队列按消息触发时间排序 |
||||
2. 设置 epoll_wait 的超时时间,使其在特定时间唤醒 |
||||
3. 关于延时精度 |
Loading…
Reference in new issue