Android IdleHandler使用方法详解
作者:xuyisheng 时间:2023-11-17 20:48:11
在Android中,Handler是一个使用的非常频繁的东西,输入事件机制和系统状态,都通过Handler来进行流转,而在Handler中,有一个很少被人提起但是却很有用的东西,那就是IdleHandler,它的源码如下。
/**
* Callback interface for discovering when a thread is going to block
* waiting for more messages.
*/
public static interface IdleHandler {
/**
* Called when the message queue has run out of messages and will now
* wait for more. Return true to keep your idle handler active, false
* to have it removed. This may be called if there are still messages
* pending in the queue, but they are all scheduled to be dispatched
* after the current time.
*/
boolean queueIdle();
}
从注释我们就能发现,这是一个IdleHandler的静态接口,可以在消息队列没有消息时或是队列中的消息还没有到执行时间时才会执行的一个回调。
这个功能在某些重要但不紧急的场景下就非常有用了,比如我们要在主页上做一些处理,但是又不想影响原有的初始化逻辑,避免卡顿,那么我们就需要等系统闲下来的时候再来执行我们的操作,这个时候,我们就可以通过IdleHandler来进行回调。
它的使用也非常简单,代码示例如下。
Looper.myQueue().addIdleHandler {
// Do something
false
}
在Handler的消息循环中,一旦队列里面没有需要处理的消息,该接口就会回调,也就是Handler空闲的时候。
这个接口有返回值,代表是否需要持续执行,如果返回true,那么一旦Handler空闲,就会执行IdleHandler中的回调,而如果返回false,那么就只会执行一次。
当返回true时,可以通过removeIdleHandler的方式来移除循环的处理,如果是false,那么在处理完后,它自己会移除。
综上,IdleHandler的使用主要有下面这些场景。
低优先级的任务处理:替换之前为了不在初始化的时候影响性能而使用的Handler.postDelayed方法,通过IdleHandler来自动获取空闲的时机。
Idle时循环处理任务:通过控制返回值,在系统空闲时,不断重复某个操作。
但是要注意的是,如果Handler过于繁忙,那么IdleHandler的执行时机是有可能被延迟很久的,所以,要注意一些比较重要的处理逻辑的处理时机。
在很多第三方库里面,都有IdleHandler的使用,例如LeakCanary,它对内存的dump分析过程,就是在IdleHandler中处理的,从而避免对主线程的影响。
来源:https://juejin.cn/post/7163086937383763975
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Spring AOP底层源码详解
C# 多网卡 Server Listen
深入理解C++中public、protected及private用法
一篇文章带你搞定SpringBoot不重启项目实现修改静态资源
![](https://img.aspxhome.com/file/2023/9/132129_0s.png)
Java实现经典游戏打砖块游戏的示例代码
![](https://img.aspxhome.com/file/2023/1/61331_0s.png)
Android调用摄像头拍照开发教程
![](https://img.aspxhome.com/file/2023/3/137593_0s.png)
Android实现EditText控件禁止输入内容的方法(附测试demo)
Java静态代理与动态代理案例详解
![](https://img.aspxhome.com/file/2023/6/103826_0s.png)
c#数据的序列化和反序列化(推荐版)
如何在IDE部署springboot项目(有swagger和无swagger都是一样的)到服务器或者虚拟机上的docker
![](https://img.aspxhome.com/file/2023/5/58185_0s.png)
c#执行外部命令示例分享
Spring中基于xml的AOP的详细步骤
spring项目中切面及AOP的使用方法
![](https://img.aspxhome.com/file/2023/8/106168_0s.png)
详解java WebSocket的实现以及Spring WebSocket
![](https://img.aspxhome.com/file/2023/5/59885_0s.png)
Spring 中 PageHelper 不生效问题及解决方法
![](https://img.aspxhome.com/file/2023/6/101986_0s.jpg)
基于Spring Mvc实现的Excel文件上传下载示例
基于Transactional事务的使用以及注意说明
深入分析Java内存区域的使用详解
java项目中使用 Lombok遇到的问题小结
![](https://img.aspxhome.com/file/2023/7/69937_0s.png)
C#如何给枚举类型增加一个描述特性详解
![](https://img.aspxhome.com/file/2023/4/85744_0s.png)