当前位置: 首页 > news >正文

Android之Handler是如何保证延迟发送的

目录

  • 核心组件
  • 延迟发送消息的工作原理
    • 具体步骤
      • 1. 创建 Handler:
      • 2.发送延迟消息
      • 3.消息入队列
      • 4.消息出队和处理:
  • 关键点
  • 总结

在 Android 中,Handler 是用于在不同线程之间传递和处理消息的工具。它可以用于定时任务、延迟执行任务等。Handler 如何保证延迟发送消息的核心在于其与 MessageQueue 和 Looper 的协同工作。

核心组件

  • Handler:
    用于发送和处理消息和可运行的任务(Runnable)。
  • MessageQueue:
    消息队列,存储所有待处理的消息。
  • Looper:
    循环从 MessageQueue 中取出消息并分发给相应的 Handler 进行处理。

延迟发送消息的工作原理

当你使用 Handler 的 postDelayed 或 sendMessageDelayed 方法时,消息会被添加到 MessageQueue 中,并带有一个指定的时间戳。Looper 会根据时间戳来决定何时处理这些消息。

具体步骤

1. 创建 Handler:

通常在主线程中创建一个 Handler,它会与主线程的 Looper 和 MessageQueue 关联。

    Handler handler = new Handler(Looper.getMainLooper());

2.发送延迟消息

使用 postDelayed 或 sendMessageDelayed 方法发送延迟消息或任务。

    // 延迟 2000 毫秒后执行 Runnable 任务handler.postDelayed(new Runnable() {@Overridepublic void run() {// 执行任务}}, 2000);// 延迟 2000 毫秒后发送消息Message msg = handler.obtainMessage();handler.sendMessageDelayed(msg, 2000);

3.消息入队列

Handler 将消息或任务添加到 MessageQueue 中,并带有一个执行时间(当前时间 + 延迟时间)。

    boolean sendMessageAtTime(Message msg, long uptimeMillis) {MessageQueue queue = mQueue;if (queue == null) {RuntimeException e = new RuntimeException(this + " sendMessageAtTime() called with no mQueue");Log.w("Looper", e.getMessage(), e);return false;}return enqueueMessage(queue, msg, uptimeMillis);}private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {msg.target = this;if (mAsynchronous) {msg.setAsynchronous(true);}return queue.enqueueMessage(msg, uptimeMillis);}

4.消息出队和处理:

Looper 不断循环,从 MessageQueue 中取出时间戳小于等于当前时间的消息进行处理。

    public static void loop() {final Looper me = myLooper();final MessageQueue queue = me.mQueue;for (;;) {Message msg = queue.next(); // 可能会阻塞if (msg == null) {// No message indicates that the message queue is quitting.return;}// 分发消息msg.target.dispatchMessage(msg);// 回收消息msg.recycleUnchecked();}}

关键点

  • 时间戳:
    每个消息在入队时都会带有一个时间戳,表示该消息何时可以被处理。
  • 消息队列排序:
    MessageQueue 会根据消息的时间戳进行排序,确保最早到期的消息最先被处理。
  • 循环检查:
    Looper 会不断循环检查 MessageQueue,一旦发现有到期的消息就立即处理。

总结

通过 Handler、MessageQueue 和 Looper 的协同工作,Android 可以实现延迟发送消息和任务的功能。Handler 将消息或任务添加到 MessageQueue 中,并带有一个执行时间戳。Looper 不断循环检查 MessageQueue,当发现有到期的消息时,立即取出并处理,从而实现延迟执行的效果。

Android 之 Handler
HandlerThread 和 Handler 区别
Android之Handler的post方法和sendMessage的区别
Android之同一个Thread线程里只能有一个Looper?(ThreadLocal)

http://www.lryc.cn/news/433380.html

相关文章:

  • 定位信标、基站、标签,定位信标是什么
  • 2024国赛数学建模B题完整分析参考论文38页(含模型和可运行代码)
  • Hive是什么?
  • 计算机网络:http协议
  • 【stata】自写命令分享dynamic_est,一键生成dynamic effect
  • 文心一言 VS 讯飞星火 VS chatgpt (342)-- 算法导论23.2 1题
  • 部署若依Spring boot项目
  • oc打包:权限弹窗无法正常弹出
  • 深入理解RxJava:响应式编程的现代方式
  • Maven 依赖漏洞扫描检查插件 dependency-check-maven 的使用
  • 2. 下载rknn-toolkit2项目
  • xhr、ajax、axois、fetch的区别
  • 【HuggingFace Transformers】OpenAIGPTModel源码解析
  • macOS安装Java和Maven
  • SpringBoot教程(安装篇) | Elasticsearch的安装
  • 前端登录鉴权——以若依Ruoyi前后端分离项目为例解读
  • 【Tools】大模型中的自注意力机制
  • PhotoZoom Classic 9软件新功能特性及安装激活图文教程
  • 【数据结构】直接插入排序
  • JavaScript 实现虚拟滚动技术
  • 【重学 MySQL】十八、逻辑运算符的使用
  • 关于 QImage原始数据格式与cv::Mat原始数据进行手码数据转换 的解决方法
  • 前端WebSocket客户端实现
  • 读取realsense d455双目及imu
  • 浮点的运算
  • 对随机游走问题的分析特定行为模式的建模
  • JVM面试(七)G1垃圾收集器剖析
  • php转职golang第一期
  • java后端服务监控与告警:Prometheus与Grafana集成
  • 【系统架构设计师】工厂方法设计模式