一.源码分析
1.点进去看 postDelayed()中的方法。里面调用 sendMessageDelayed 方法,和post() 里面调用的方法一样。
public final boolean postDelayed(Runnable r, long delayMillis){
return sendMessageDelayed(getPostMessage(r), delayMillis);
}
2. 我们再点进去看下 sendMessageDelayed()方法,
public final boolean sendMessageDelayed(Message msg, long delayMillis){
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
里面调用了 sendMessageAtTime(),这里的 SystemClock.uptimeMillis()是获取系统从开机启动到现在的时间,期间不包括休眠的时间,这里获得到的时间是一个相对的时间,而不是通过获取当前的时间(绝对时间)。而之所以使用这种方式来计算时间,而不是获得当前 currenttime 来计算,在于handler 会受到阻塞,挂起状态,睡眠等,这些时候是不应该执行的;如果使用绝对时间的话,就会抢占资源来执行当前 handler 的内容,显然这是不应该出现的情况,所以要避免。
3.点进 sendMessageAtTime()方法看看
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(this + " sendMessageAtTime() called with no mQueue");
Log.w("Lo