在使用handlre消息队列执行任务时,常规的调用是调用post立即执行,任务按照时间顺序来执行,
393 public final boolean post(Runnable r)
394 {
395 return sendMessageDelayed(getPostMessage(r), 0);
396 }
这里考虑这样一个场景,比如有3个任务,需要间隔20ms来执行,(比如我们来构造3个连续的点击事件),这个时候就需要考虑怎样发起延迟调用,直接使用sleep也可以实现,但是看上去似乎不是那么优雅,会导致当前线程的sleep。
Handler中已经实现了这样的功能来方便调用,
467 public final boolean postDelayed(Runnable r, long delayMillis)
468 {
469 return sendMessageDelayed(getPostMessage(r), delayMillis);
470 }
调用到
662 public final boolean sendMessageDelayed(Message msg, long delayMillis)
663 {
664 if (delayMillis < 0) {
665 delayMillis = 0;
666 }
667 return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
668 }
再调用到
689 public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
690 MessageQueue queue = mQueue;
691 if (queue == null) {
692 RuntimeException e = new RuntimeException(
693 this + " sendMessageAtTime() called with no mQueue");
694 Log.w("Looper", e.getMessage(), e);
695 return false;
696 }
697 return enqueueMessage(queue, msg, uptimeMillis);
698 }
为什么可以根据传人的时间去调起任务呢,
主要是调用了底层的epoll_wait来实现的,epoll_wait方法有时间参数
#include <sys / epoll.h>
int epoll_wait(int epfd,struct epoll_event * events, int maxevents,int timeout);
参考资料
sendMessageDelayed延时发送详解_不知名的一只猫的博客-CSDN博客_sendmessagedelayed