IdleHandler是什么?有什么用?怎么用?
是什么?
是个回调接口。当发现这个线程阻塞等待消息的时候就会触发这个回调
queueIdle()返回值是boolean。当messageQueue里面的所有消息都处理完了或者等待下一条消息的时候(触发时机还没到)会触发。当return true,表示IdelHandler一直有效,false表示这个IdelHandler要被移除。

怎么用?

当return true,表示IdelHandler一直有效,false表示这个IdelHandler要被移除

idelHandler又是在什么时候获取的呢?
Looper.loop()->queue.next()

在哪些场景使用?
在Framework有哪些地方有用到IDLEHandler:
主线程在idle的时候调用gc

等待线程处于idle状态的时候

同步等待线程idle

在开发中的应用
延时执行的任务
某些场景的初始化等操作需要延时执行,如果用postDelayed去设置固定的延时时间,这明显不科学,用idleHandler就比较合适了
private void extracted() {
Looper.myQueue().addIdleHandler(new DoSomethingIdleHandler());
}
class DoSomethingIdleHandler implements MessageQueue.IdleHandler{
@Override
public boolean queueIdle() {
doSomething();
return false;
}
}
private void doSomething() {
// TODO: 2021/12/4 do what you want
}
批量任务:任务密集,且只关注最终结果
举个例子:如果有个业务场景会在一时间批量的接收到消息推送,如果刷新页面的业务逻辑是比较重的,这时候每接收到一条消息就要去刷新界面明显就不合适了,这时我们可以考虑建个工作线程,每条推送都包装成一个消息,放入队列中去,直到这个工作线程处于idle状态的时候才去执行刷新界面的逻辑
它的内部是什么原理?
做什么的?
它是一个接口回调,当线程阻塞等待下一条消息的时候会触发回调
实现原理又是怎么样的?
在Looper.loop()–》queue.next()中,该方法nativePollOnce将一直阻塞直至有下一条可用的消息才会被唤醒,而它又是如何被唤醒的呢?在将msg插入队列过程中,会先msg.queue.enqueueMessage(),并且会调用nativeWake()的native函数,里面会执行native层中messageQueue.wake(),messageQueue会调用linux系统层的epoll方法监听文件描述符的IO事件,native层中looper.wake(),中写入一个可读事件,nativePollOnce这时会读取这个IO的epoll-await,当这个epoll-wait时间到了,就会唤醒
自己在项目中是怎么用的,举例说明下?
启动app时部分库的延时初始化、
批量任务集中处理:
IdleHandler是Android中的一个回调接口,当线程等待消息时触发。它用于在主线程空闲时执行特定任务,如GC或延时操作。在批量任务处理和初始化场景中有实用价值。其内部原理涉及Looper.loop()、nativePollOnce()和epoll系统调用,通过文件描述符的IO事件唤醒阻塞。
1946

被折叠的 条评论
为什么被折叠?



