【Handler】IdleHandler

深入分析Activity onStop()生命周期延时10s回调的原因 Activiy生命周期 根据上图,现在有Activity A跳转到Activity B时,页面A,B的生命周期为: onPause(A)—onCreate(B)—onStart(B)—onResume(B)—onStop(A) 点击返回键从Activity B返回 Activity A 时,页面A,B的生命周期为: onPause(B)—onRestart(A)—onStart(A)—onResume(A)—onStop(B)—onDestory(B) 由于Activity生命周期都是在UI线程中执行,以 阅读详情

当 MessageQueue 空闲的时候,会调用 IdleHandler 里面的方法,可用于启动优化,利用空闲时间加载配置,避免卡住 UI 的展示。

使用场景

1.Activity 的生命周期回调 #onStop 和 #onDestroy
2.启动优化(WebView的引擎提前加载)

booster ShadowWebView

基础使用

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    mainLooper.queue.addIdleHandler {
        //加载闲时任务
        false
    }
}

返回值 false 表示任务只会执行一次
返回值 true 表示任务会执行多次

原理

@UnsupportedAppUsage
private final ArrayList<IdleHandler> mIdleHandlers = new ArrayList<IdleHandler>();

@UnsupportedAppUsage
Message next() {
    // Return here if the message loop has already quit and been disposed.
    // This can happen if the application tries to restart a looper after quit
    // which is not supported.
    final long ptr = mPtr;
    if (ptr == 0) {
        return null;
    }

    int pendingIdleHandlerCount = -1; // -1 only during first iteration
    int nextPollTimeoutMillis = 0;
    for (;;) {
        if (nextPollTimeoutMillis != 0) {
            Binder.flushPendingCommands();
        }

        nativePollOnce(ptr, nextPollTimeoutMillis);

        synchronized (this) {
            ...
            // 如果第一次空闲,那么获取要运行的空闲程序的数量。
            // 空闲句柄仅在队列为空或第一条消息时运行
            // 在队列中(可能是一个同步屏障)是由于在将来被处理。
            if (pendingIdleHandlerCount < 0
                && (mMessages == null || now < mMessages.when)) {
                pendingIdleHandlerCount = mIdleHandlers.size();
            }
            if (pendingIdleHandlerCount <= 0) {
                //没有空闲的处理程序可以运行。循环并等待更多时间。
                mBlocked = true;
                continue;
            }

            if (mPendingIdleHandlers == null) {
                mPendingIdleHandlers = new IdleHandler[Math.max(pendingIdleHandlerCount, 4)];
            }
            mPendingIdleHandlers = mIdleHandlers.toArray(mPendingIdleHandlers);
        }

        // 运行空闲处理程序。
        // 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(TAG, "IdleHandler threw exception", t);
            }

            if (!keep) {
                synchronized (this) {
                    mIdleHandlers.remove(idler);
                }
            }
        }

        // Reset the idle handler count to 0 so we do not run them again.
        pendingIdleHandlerCount = 0;

        // While calling an idle handler, a new message could have been delivered
        // so go back and look again for a pending message without waiting.
        nextPollTimeoutMillis = 0;
    }
}

判断消息队列当前没有消息的时候会执行 mIdleHandlers 中的任务

消息队列是空的时候,插入一个屏障,会触发IdleHandler么?

答:不会,插入屏障,并不会唤醒线程

如果删除了屏障,消息队列空了,会触发IdleHandler么?

答:不会。处理完消息,发现目前没有消息要处理(也可以是触发时间没到),触发IdleHandler,处理完毕。会再次检查是否有消息要处理,因为IdleHandler触发时,有可能有新的消息插入消息队列。如果没有,进入休眠,再次被唤醒时,不会再次(重复)触发IdleHandler。简单的说就是消息队列处理完最后一个消息,休眠之前调用过IdleHandler,休眠之后被唤醒,还是没有要处理的消息,不会重复调用IdleHandler

如果消息队列只有一个屏障消息,插一个普通消息会触发IdleHandler么?

答:有可能。IdleHandler的触发条件是,消息队列为空,或者第一条消息的触发时间还没到。所以如果屏障的超时时间还没有到,也就是目前还没有消息要处理,会触发IdleHandler

如果消息队列只有一个屏障消息,插入一个异步消息会触发IdleHandler么?

答:有可能,关键看屏障的触发时间到了没有,如果没有到,就会触发IdleHandler,反之就不会。

注意事项

1.不要加载耗时任务

耗时任务会卡住其他任务的执行

2.不要添加太多任务

闲时加载的时候,会一次性处理完所有的闲时任务,时间太长会导致 ANR

资料

[1].IdleHandler你会用吗?记一次IdleHandler使用误区,导致ANR
[2].Handler之消息屏障你应该知道的

面试官:“看你简历上写熟悉 Handler 机制,那聊聊 IdleHandler 吧?” 一. 序 Handler 机制算是 Android 基本功,面试常客。但现在面试,多数已经不会直接让你讲讲 Handler 的机制,Looper 是如何循环的,MessageQueue 是如何管理 Message 等,而是基于场景去提问,看看你对 Handler 机制的掌握是否扎实。 本文就来聊聊 Handler 中的 IdleHandler,这个我们比较少用的功能。它能干什么?怎么使用?... 阅读详情

相关推荐

深入源码分析Handler 消息机制 、Looper、MessageQueue 消息同步屏障、IdleHandler、Message 复用

Handler 线程通信 基本使用 在Android 中Handler来实现,大多数都是用来实现,子线程中发送消息,到主线程中更新UI,下面是基本使用 // 步骤1:在主线程中 通过匿名内部类 创建Handler类对象 mHandler = new Handler(){ // 通过复写handlerMessage(),处理其他线程发来的消息 ...

薛瑄的博客 2096

addIdleHandler代码不执行

addIdleHandler代码不执行问题定位

体验Android编程之美 2059

手把手教你用MaxEnt+ArcGIS玩转物种分布预测

本文详细介绍了如何利用MaxEnt最大熵模型与ArcGIS软件进行物种分布预测。通过实战案例,从数据收集、环境变量处理、模型参数设置到结果可视化分析,手把手教你掌握生态位模型的核心流程。结合SDM toolbox插件,可高效完成数据预处理与高级空间分析,是生态学与保护生物学研究的实用指南。

weixin_29309475的博客 559

IdleHandler,页面启动优化神器

开发是面向对象。我们找工作应该更多是面向面试。哪怕进大厂真的只是去宁螺丝,但你要进去得先学会面试的时候造飞机不是么?作者13年java转Android开发,在小厂待过,也去过华为,OPPO等,去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含。

2401_84149845的博客 507

VScode远程连接开发嵌入式开发板

VScode远程连接开发调试嵌入式开发板

qq_53221728的博客 5891

BEVFormer与TensorRT的完美结合:如何实现4倍推理加速?

本文详细解析了如何通过TensorRT的量化技术和自定义插件实现BEVFormer模型的4倍推理加速,同时保持精度损失小于1%。文章从模型架构与部署挑战入手,深入探讨了计算图优化、自定义插件开发和量化校准策略,并提供了完整的部署流程和性能调优技巧,为自动驾驶领域的实时3D感知提供了高效解决方案。

bean的博客 221

IdleHandler源码分析-使用场景

Idlehandler是一个接口,存在于MessageQueue里,官方文档说,当一个线程在阻塞状态,等待其他信息都时候,会被回调。很多文档都说它是当Activity得UI线程执行完毕得一个回调,可以进行一些初始化和优化的操作。比如:当界面绘制完毕,获取view得宽高。 /** * Callback interface for discovering when a thread ...

Chents 1421

Qwen3-Embedding选型指南:0.6B/4B/8B三版本性能对比与场景匹配建议

本文深入解析阿里开源的Qwen3-Embedding系列模型(0.6B/4B/8B)的性能差异与适用场景,提供从边缘计算到云端部署的实战选型建议。通过实测数据对比响应延迟、内存占用和多语言精度等核心指标,帮助技术团队根据业务需求选择最优模型版本,并分享边缘设备优化与云端成本测算策略。

qsc901234567的博客 892

IdleHandler基本知识及使用

IdleHandler基本只是及使用

XinHao_Sir的博客 3288

【PINN高级教程】范式融合与前沿应用 第5讲:贝叶斯推断与生成式建模的深度融合

正规化流(Normalizing Flow, NF)通过一系列可逆变换把简单分布映射为复杂后验,从而获得更好的表达能力。算子学习保持映射的物理正确性。贝叶斯推断给出了自然的框架,但直接对高维函数空间做采样(如 MCMC)几乎不可行。1️⃣ 在自己的 PDE 上跑一遍完整的 Bayesian PINN 流模型。的学习机制深度融合,以在保持物理一致性的前提下,高效地从后验分布中采样。2️⃣ 将每个 θ 直接映射到 FNO 权重,得到不同解的采样。的后验 p(θ∣x,y)p(θ∣x,y) 进行近似。

u012133341的博客 474

Yolov8轻量级网络:Ghostnet、G_ghost、Ghostnetv2家族大作战(一):华为Ghostnet,超越谷歌MobileNet | CVPR2020

Yolov8引入轻量级网络Ghostnet、G_ghost、Ghostnetv2等,减少最新的深度神经网络的计算成本,引入高效的神经网络结构。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 2566

Handler及IdleHandler机制

组成 Message:消息 同步消息(个人创建)、异步消息(系统创建)。 参数 when 表示该消息被执行的时间,参数 target 记录处理 Message 的 Handler。 MessageQueue:单链表队列,存储 Message,以 when 排序。 Handler:发送和处理 Message。定义 Handler 的线程,即为其处理 Message 的线程。 Looper: 死循环,不断从 MessageQueue 里取出 Message,交由 Handler 处理。 主线程自带

Iceti9er的专栏 1185

基于深度学习的心律失常的自动分类

基于深度学习的心律失常的自动分类 作者:禅与计算机程序设计艺术 1. 背景介绍 1.1 心律失常的危害与检测的重要性 心律失常是一种常见的心血管疾病,严重威胁着人们的健康和生命。据统计,全球每年有数百万人因心律失

AI架构师小马 1139

[Android] Handler中的IdleHandler

抛出 Handler中的IdleHandler 它有什么能力? 它有什么用处? 能想到一些合适的场景吗? Answer1: 首先看下源码的注释 /** * Callback interface for discovering when a thread is going to block * waiting for more messages. */ ...

merbn的博客 832

Playwright爬虫实战:破解动态网页懒加载与无限滚动

本文介绍了使用Playwright处理懒加载和无限滚动页面的完整解决方案。摘要如下: 问题分析:传统爬虫无法获取JS动态渲染内容,Playwright能模拟真实浏览器行为解决此类问题。 核心原理: 懒加载:资源延迟加载,滚动触发 无限滚动:滚动到底部异步加载新内容 技术方案: 分段滚动页面并等待加载 动态监测页面高度变化 合理设置等待和终止条件 代码实现: 提供图片懒加载和无限滚动列表的完整可运行代码 包含异常处理和性能优化建议 关键优势: 比传统爬虫更可靠 支持复杂交互场景 完善的错误处理机制 该方法已在

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 523

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Handler后台空闲线程IdleHandler

在Android中,我们可以处理Message,这个Message我们可以立即执行也可以delay 一定时间执行。Handler线程在执行完所有的Message消息,它会wait,进行阻塞,知道有心的Message到达。如果这样子,那么这个线程也太浪费了。MessageQueue提供了另一类消息,IdleHandler。 IdleHandler在Handler空闲时执行,下面来看案例代码: M...

android开发笔记 1125

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Handler中的IdleHandler

IdleHandler 基本情况 IdleHandler 可以用来提升性能,主要用在我们希望能够在当前线程 消息队列空闲时 做些事情(例如UI线程在显示完成后,如果线程空闲我们就可以提前准备其他内容)的情况下,不过最好不要做耗时操作。 具体用法如下 //getMainLooper().myQueue()或者Looper.myQueue() Looper.myQueue().addIdleHandl...

ruanyandong的博客 573

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IdleHandler一个后娘养的handler

handler是在不停的监听程序,如果有消息,那么ji

a11544的专栏 1101

Handler 与 IdleHandler 浅析

Handler 分析 虽然 Handler 分析的比较多,可还是想记录下自己分析的思路。 基于 :JKD 1.8 SDK 26 我们设计一个程序时,往往会执行很多小块的代码,而很多小块的代码还经常被调用, 那么根据程序设计的原理,最好抽出公共部分,增加代码的复用性。 这也是 Handler 使用时既有 sendMessage() 也有 postRunnable() 的原因。 sendMe...

RamboPan 3447

面试官:“看你简历上写熟悉 Handler 机制,那聊聊 IdleHandler 吧?”(1)

二. IdleHandler。

2401_84544531的博客 681

Android Handler消息机制完全解析-IdleHandler和epoll机制(四)

经过前面的学习相信大家对Handler已经有了比较全面且深入的认识,我在写第一篇的时候就说过Handler相关的知识远比我们想象的要多,到这里大家是不是略有体会呢?今天和大家一起学习的是IdleHandler和epoll机制,这两个可能平时用到的不多,尤其是epoll,但是它的原理以及思想我们要清楚,有些面试可能会问到,有一句话叫"有剑不用和没有剑是两码事"。废话不多说我们开始学习今天的内容,通过本篇博客你将学习到以下内容1.IdleHandler是什么。

乐于分享,乐于讨论,欢迎大家积极讨论 1279

Handler之IdleHandler

MessageQueue提供了另一类消息,IdleHandler 如果返回false,每次轮询都会调用(理论上应该可以做一些别的东西) Looper.myQueue().addIdleHandler(new MyIdleOnce()); Looper.myQueue().addIdleHandler(new MyIdleKeep()); //removeIdle...

weixin_30600503的博客 77

163.Handler–IdleHandler–在主线程空闲时间执行任务–性能优化

因此,在 UI 主线程相对繁忙时,通过 IdleHandler 来分摊任务,可以让系统先处理用户的核心交互,待系统空闲时再处理次要任务,充分利用 CPU 空闲时间。需要注意的是,这里的“空闲”并不是完全没有任务,而是当前没有需要立即处理的消息存在。当你想利用主线程空闲时间执行任务时,首先需要获取当前线程(通常为主线程)的消息队列,通过 Looper.myQueue() 方法获得,再调用 addIdleHandler() 方法注册一个实现了 MessageQueue.IdleHandler 接口的实例。

2303_79132118的博客 926
上一篇: Android - Intent
Client_Block
博客等级 码龄11年 33粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值