handler的原理分析

最近因为想写一个handler的计时器,看到了handler的原理分析,通俗易懂,所以记录下来了,以便以后自己忘记

handler原理分析转自:https://www.cnblogs.com/xiongwo/p/5622422.html

### Handler 工作机制及原理 Handler 是 Android 中用于线程间通信的核心组件之一,它通过 Looper 和 MessageQueue 实现了消息的发送与处理机制。以下是对其工作机制和原理的详细分析: #### 1. 核心组件及其关系 Handler 的工作依赖于三个核心组件:Looper、MessageQueue 和 Handler[^2]。 - **Looper**:每个线程可以拥有一个 Looper 对象,它负责管理该线程的消息队列(MessageQueue)。主线程在创建时已经默认初始化了一个 Looper[^3]。 - **MessageQueue**:存储由 Handler 发送的消息和任务,Looper 不断从这个队列中取出消息并分发给对应的 Handler 进行处理。 - **Handler**:用于发送消息到 MessageQueue,并处理从队列中取出的消息。 #### 2. 消息发送流程 当调用 `Handler.sendMessage()` 或 `Handler.post()` 方法时,消息会被封装为 Message 对象并添加到 MessageQueue 中[^2]。具体流程如下: - 调用 `Handler.sendMessage(msg)` 或 `Handler.post(runnable)`。 - Handler 将消息或任务封装为 Message 对象。 - 调用 `MessageQueue.enqueueMessage(msg, uptimeMillis)` 将消息插入到队列中。 ```java // 示例代码:发送一条延时消息 Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { // 执行任务 } }, 1000); // 延时1秒执行 ``` #### 3. 消息处理流程 Looper 在其 `loop()` 方法中不断从 MessageQueue 中取出消息,并将其交给对应的 Handler 处理[^2]。具体流程如下: - Looper 调用 `MessageQueue.next()` 获取下一条消息。 - 如果消息有回调函数(callback),优先执行回调函数。 - 如果没有回调函数,则调用 Handler 的 `handleMessage()` 方法处理消息[^5]。 ```java // 示例代码:处理消息 Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // 处理消息逻辑 } }; ``` #### 4. 主线程为何不会 ANR 主线程的 Looper 在系统启动时已经初始化完毕,且主线程的 MessageQueue 会持续接收来自各种事件源的消息(如触摸事件、绘制请求等)。即使某些消息处理时间较长,只要 Looper 不被阻塞,系统仍能继续处理其他消息,从而避免 ANR(Application Not Responding)[^4]。 #### 5. 固定频率任务的实现方式 对于需要固定频率执行的任务,常见的实现方式包括以下几种[^4]: - 使用 `Handler.postDelayed` 定时发送消息,但精度可能受到消息队列中其他消息的影响。 - 使用 `Timer`,但其底层实现可能导致多线程竞争问题。 - 使用 `AlarmManager`,适合对精度要求不高且需要跨进程调度的任务。 - 使用固定频率的线程池执行任务。 - 使用 `Choreographer` 添加监听器,适合需要与帧率同步的任务。 ### 总结 Handler 的工作机制基于 Looper 和 MessageQueue,实现了线程间的异步消息传递。通过将消息发送到 MessageQueue 并由 Looper 分发给 Handler 处理,确保了主线程能够高效地响应各种事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值