在日常开发中,需要延时任务的时候,往往会用到handler.postDelay()的方法,那么一起来看看它的内部实现原理吧。
//Handler.java
public final boolean postDelayed(Runnable r, long delayMillis)
{
return sendMessageDelayed(getPostMessage(r), delayMillis);
}
在内部调用了sendMessageDelayed这个方法,而这个方法的返回值是布尔型,返回true表示这条消息已经被成功的放到了消息队列,返回false表示这条消息添加失败,在来看sendMessageDelayed方法的内部实现
//Handler.java
public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
首先对时间做了一个格式化,并且在时间上做了一个当前时间和我们传入的延时时间的和,而不是只使用延时时间,接着直接返回sendMessageAtTime这个方法,这个方法的返回值表示的意思和上面一样,是一系列的传递,再来看sendMessageAtTime方法
//Handler.java
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("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
这个方法对消息队列做了一个判空,然后接着调用enqueueMessage方法
//handler.java
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
通过这一串方法的调用,实际上也就是将一条消息插入到了消息队列里。在来看具体的插入过程
MessageQueue.java
boolean enqueueMessage(Message msg, long when) {
if (msg.target == null) {
throw new IllegalArgumentException("Message must have a target.");
}
if (msg.isI