最近希望能够在当线程空闲做些准备工作,比如主线程在开始加载页面完成后,如果线程空闲就提前加载些二级页面的内容。对于这种情况下,可以考虑使用MessageQueue.IdleHandler来实现。
具体的实现方式:
getMainLooper().myQueue().addIdleHandler(newThreadIdleHander());
其中:
classThreadIdleHander implementsMessageQueue.IdleHandler {
@Override
publicbooleanqueueIdle() {
return false;
}
}
其中的getMainLooper是获得当前主线程的Looper,然后在其中的MessageQueue中加入一个IdleHandler.当线程空闲时,就会去调用queueIdle()函数,如果返回值为True,那么后续空闲时会继续的调用此函数,否则不再调用;
上述逻辑的具体实现方式:
loop每次从MessageQueue取出一个Message,如果当前队列中没有任何消息的时,就去查找是否注册了IdleHandler的回调,如果有的话,则每个的执行,逻辑很简单。
final Message next() {
...
// Run the idle handlers. // We only ever reach this code block during the first iteration. for (int i = 0; i < pendingIdleHandlerCount; i++) { final IdleHandler idler = mPendingIdleHandlers[i]; mPendingIdleHandlers[i] = null; // release the reference to the handler boolean keep = false; try { keep = idler.queueIdle(); } catch (Throwable t) { Log.wtf("MessageQueue", "IdleHandler threw exception", t); } if (!keep) { synchronized (this) { mIdleHandlers.remove(idler); } } }
}