| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 移动开发 -> 关于空闲任务IdleHandler的那些事 -> 正文阅读 |
|
|
[移动开发]关于空闲任务IdleHandler的那些事 |
关于空闲任务IdleHandler的那些事??Android的消息机制Handler已经是老生常谈了,包括Android Framework层的应用启动过程都涉及消息机制,肥柴在“一切从Android的Handler讲起”专栏中已经讲了很多。 ??对于Android中的消息处理机制来说,MessageQueue和Looper、Message是非常重要的对象,而IdleHandler是MessageQueue的静态内部接口。那什么是IdleHandler呢?
一、IdleHandler??IdleHandler是一种在只有当消息队列没有消息或者是队列中的消息还没到执行时间时,才会执行的任务,其存放在MessageQueue的mIdleHandlers队列中。
??使用方式是实现IdleHandler接口,在queueIdle实现MessageQueue空闲时需要处理的逻辑,并通过addIdleHandler()方法添加到mIdleHandlers队列中。
二、IdleHandler实现基本原理??知道了IdleHandler的定义和使用,那么Handler消息机制是如何实现MessageQueue空闲的时候调用IdleHandler进行任务处理的呢?这就需要我们从MessageQueue的next方法入手了,至于Looper消息的获取可以见肥柴之前的:一切从Android的Handler讲起(四):Looper消息获取一文。
??这里肥柴把源码里涉及到IdleHandler处理的进行了注释,重点看注释的地方即可,从而我们可以总结IdleHandler实现的基本原理流程: ??1、如果本次循环拿到的Message为空,或者这个Message是一个延时的消息而且还没到指定的触发时间,那么,就认定当前的队列为空闲状态。 ??2、遍历mPendingIdleHandlers数组(这个数组里面的元素每次都会到mIdleHandlers中去拿)来调用每一个IdleHandler实例的queueIdle方法。 ??3、如果这个方法返回false的话,那么这个实例就会从 mIdleHandlers 中移除,也就是当下次队列空闲的时候,不会继续回调它的 queueIdle 方法了。 ??4、处理完 IdleHandler 后会将 nextPollTimeoutMillis 设置为0,也就是不阻塞消息队列,当然要注意这里执行的代码同样不能太耗时,因为它是同步执行的,如果太耗时肯定会影响后面的 message 执行。
三、使用场景??根据IdleHandler的特性,其使用场景遵循一个基本原则:在不影响其他任务,在消息队列空闲状态下执行。 ??Android Framework层的GC场景就使用了这个机制,只有当cpu空闲的时候才会去GC。
??而我们熟知的内存泄漏检测库LeakCanary,其进行内存泄漏检测并不是 onDestry 方法执行完成后就进行垃圾回收和一些分析的,而是利用 IdleHandler 在空闲的时候进行这些操作的,尽量不去影响主线程的操作。
|
|
|
| 移动开发 最新文章 |
| Vue3装载axios和element-ui |
| android adb cmd |
| 【xcode】Xcode常用快捷键与技巧 |
| Android开发中的线程池使用 |
| Java 和 Android 的 Base64 |
| Android 测试文字编码格式 |
| 微信小程序支付 |
| 安卓权限记录 |
| 知乎之自动养号 |
| 【Android Jetpack】DataStore |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/29 11:54:01- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |