
首先,需要明确一点,Handler 延时消息机制不是延时发送消息,而是延时去处理消息;举个例子,如下:
上面的 Handler 不是延时3秒后再发送消息,而是将消息插入消息队列后等3秒后再去处理。
postDelayed 的方法如下:
其中的 getPostMessage 就是将 post 的 runnable 包装成 Message,如下:
sendMessageDelayed 方法如下:
sendMessageAtTime 如下:
这里面的代码很好理解,就不说了,看看 enqueueMessage:
MessageQueue 的 enqueueMessage 的方法如下:
举个例子,假设我们消息队列是空的,然后我发送一个延时10s的延时消息,那么会直接把消息存入消息队列。
从消息队列中获取消息是 通过 Looper.loop() 来调用 MessageQueue 的 next()方法,next()的主要代码如下:
其实,从这里就可以看出来,Handler 的延时消息是如何实现的了。
比方说 发送一个延时10s的消息,那么在 next()方法是,会阻塞 (10s + 发送消息时的系统开机时间 – 执行next()方法是系统的开机时间),到达阻塞时间时会唤醒。或者这时候有新的消息来了也会 根据 mBlocked=true来唤醒。
在 MessageQueue 类中有一个 static 的接口 IdleHanlder:
当MessageQueue中无可处理的Message时回调; 作用:UI线程处理完所有事务后,回调一些额外的操作,且不会堵塞主进程;
接口中只有一个 queueIdle() 函数,线程进入堵塞时执行的额外操作可以写这里, 返回值是true的话,执行完此方法后还会保留这个IdleHandler,否则删除。