一、问题
当我们创建好Handler后,假设通过 postDelayed 方法发送一个延迟消息,之后修改系统时间,会影响该延迟消息的发送吗?
二、分析
1.首先查看 postDelayed 方法源码
public final boolean postDelayed(
@NonNull Runnable r, @Nullable Object token, long delayMillis) {
return sendMessageDelayed(getPostMessage(r, token), delayMillis);
}
该方法内部直接调用了sendMessageDelayed
2.继续查看 sendMessageDelayed 方法源码
public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
3.继续查看 sendMessageAtTime 方法源码
public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
该方法内部判断了 MessageQueue 是否为空,之后调用了enqueueMessage
4.查看 enqueueMessage 方法源码
private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg,
long uptimeMillis) {
msg.target = this;
msg.workSourceUid = ThreadLocalWorkSource.getUid();
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
最终可以确定 sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); 是设置延迟的重点。uptimeMillis() 方法是一个 native方法,它返回自启动以来非睡眠正常运行时间的毫秒数。
三、结论
因此 Handler 的延迟时间与系统时间没有关系,修改系统时间对Handler延迟消息无影响。