IdleHandler类可以用于监控MessageQueue队列是否为空, 当MessageQueue队列为空时,可以根据回调方法queueIdle()执行一些操作
IdelHandler定义
/** * Callback interface for discovering when a thread is going to block * waiting for more messages. */ public static interface IdleHandler { /** * Called when the message queue has run out of messages and will now * wait for more. Return true to keep your idle handler active, false * to have it removed. This may be called if there are still messages * pending in the queue, but they are all scheduled to be dispatched * after the current time. */ boolean queueIdle(); }
IdleHandler是一个用于获取Looper线程准备进入阻塞等到更多Message的回调接口
queueIdle方法的注释, 说了2点:
1.调用时机:当MessageQueue消息队列为空时会调用; 最后还说了如果有延时消息的时候(执行时间比当前时间要晚)也会执行;
2.返回值含义:返回true时会使MessageQueue保持IdleHandler 的引用,等待下次消息队列为空时继续执行;返回false时则会将IdleHandler从MessageQueue中移除;
使用:
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() { @Override public boolean queueIdle() { //根据返回值决定,下一次MessageQueue为空时是否调用当前实例的queueIdle方法 //返回false时当前实例会被清除出MessageQueue;返回true则不会,当下一次MessageQueue为空值还会继续调用当前实例的queueIdle方法 return false; } });
一些常见的使用场景:
1.计算Activity实际显示View所耗费的时间
2.线程的并发控制-通过单线程+ 消息队列来实现线程安全控制。