IdleHandler原理

IdleHandler是Android中的一个回调接口,当线程等待消息时触发。它用于在主线程空闲时执行特定任务,如GC或延时操作。在批量任务处理和初始化场景中有实用价值。其内部原理涉及Looper.loop()、nativePollOnce()和epoll系统调用,通过文件描述符的IO事件唤醒阻塞。

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时部分库的延时初始化、
批量任务集中处理:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值