MessageQueue.IdleHandler可以用来在线程空闲的时候,指定一个操作;有点类似Handler.postDelayed(Runnable r, long delayMillis),都是在将来的某一个时间
执行一个操作。
不过,使用IdleHandler的好处在于可以不用指定一个将来时间,只要线程空闲了,就可以执行它指定的操作。
比较适合那种需要在将来执行操作,但是又不知道需要指定多少延迟时间的操作。
只要使用Looper.myQueue().addIdleHandler(xxx)就可以了。这样,在线程空闲,也就是activity创建完毕之后,它会执行queueIdle里面的代码。
返回值的含义在代码里面注释说明了,
true,表示needKeep,也就是保留,当queueIdle执行完毕之后,不会移除这个IdleHandler
false,表示这个IdleHandler不需要保留,也就是只需要执行一遍。
android里面消息机制的关键在于Looper.loop()方法,因为它把一个简单的线程做成了一个死循环,这样才能保证持续的响应消息。
loop()方法可以看出,它是一个死循环
for(;;){...}
这段代码的关键是 Message msg = queue.next(); // might block
这是去获取下一个消息,从注释可以看出,它是一个可能阻塞的方法,底层是使用epoll机制来实现的,这个暂且不提。
我们继续跟踪queue.next();
底层获取一个消息,nativePollOnce(mPtr, nextPollTimeoutMillis); 这个先不分析。
当获取到消息之后,正常逻辑是得到一个正常的消息,然后返回给Looper去执行这个消息。
但是,如果返回的消息等于null的话,那么就暂时不会返回,而是继续往下面执行
然后,它首先判断pendingIdleHandlerCount的个数,这个IdleHandler就是我们最开始的时候添加的IdleHandler。
如果有IdleHandler的话,就执行。
逐个调用IdleHandler的queueIdle方法,
keep = idler.queueIdle();
然后根据返回值决定要不要keep这个IdleHander,如果返回false,也就是不保留的话,就执行移除IdleHandler的操作,这样下次线程再空闲的时候,就不会调用这个IdleHandler了。
http://bbs.51cto.com/thread-1094228-1.html
![Uploading Paste_Image_172165.png . . .]