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)
相关文章:
Android之Handler是如何保证延迟发送的
目录 核心组件延迟发送消息的工作原理具体步骤1. 创建 Handler:2.发送延迟消息3.消息入队列4.消息出队和处理: 关键点总结 在 Android 中,Handler 是用于在不同线程之间传递和处理消息的工具。它可以用于定时任务、延迟执行任务等。Handler 如何保证延迟发送消息的核…...
定位信标、基站、标签,定位信标是什么
定位信标、基站、标签,定位信标是什么 今天给各位分享定位信标、基站、标签的知识,其中也会对定位信标是什么进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! 怎样做人员定位啊? 〖…...
2024国赛数学建模B题完整分析参考论文38页(含模型和可运行代码)
2024 高教社杯全国大学生数学建模完整分析参考论文 B 题 生产过程中的决策问题 目录 摘要 一、问题重述 二、问题分析 三、 模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码(仅供参考) 4.…...
Hive是什么?
Apache Hive 是一个基于 Hadoop 的数据仓库工具,用于在 Hadoop 分布式文件系统(HDFS)上管理和查询大规模结构化数据集。Hive 提供了一个类似 SQL 的查询语言,称为 HiveQL,通过这种语言可以在 HDFS 上执行 MapReduce 作…...
计算机网络:http协议
计算机网络:http协议 一、本文内容与前置知识点1. 本文内容2. 前置知识点 二、HTTP协议工作简介1. 特点2. 传输时间分析3. http报文结构 三、HTTP版本迭代1. HTTP1.0和HTTP1.1主要区别2. HTTP1.1和HTTP2主要区别3. HTTPS与HTTP的主要区别 四、参考文献 一、本文内容…...
【stata】自写命令分享dynamic_est,一键生成dynamic effect
1. 命令简介 dynamic_est 是一个用于可视化动态效应(dynamic effect)的工具。它特别适用于事件研究(event study)或双重差分(Difference-in-Differences, DID)分析。通过一句命令即可展示动态效应…...
文心一言 VS 讯飞星火 VS chatgpt (342)-- 算法导论23.2 1题
一、对于同一个输入图,Kruskal算法返回的最小生成树可以不同。这种不同来源于对边进行排序时,对权重相同的边进行的不同处理。证明:对于图G的每棵最小生成树T,都存在一种办法来对G的边进行排序,使得Kruskal算法所返回的…...
部署若依Spring boot项目
nohup和& nohup命令解释 nohup命令:nohup 是 no hang up 的缩写,就是不挂断的意思,但没有后台运行,终端不能标准输入。 nohup :不挂断的运行,注意并没有后台运行的功能,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,注意了nohup没有后台…...
oc打包:权限弹窗无法正常弹出
在遇到编写了权限无法弹出弹窗时,需要查看是不是调用时机不对,这里直接教万能改法。 将权限获取方法编写在applicationDidBecomeActive 进入前台的生命周期接口中,如下: if (@available(iOS 14, *)) {NSLog<...
深入理解RxJava:响应式编程的现代方式
在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJ…...
Maven 依赖漏洞扫描检查插件 dependency-check-maven 的使用
前言 在现代软件开发中,开源库的使用愈加普遍,然而这些开源库中的漏洞往往会成为潜在的安全风险。如何及时的发现依赖的第三方库是否存在漏洞,就变成很重要了。 本文向大家推荐一款可以进行依赖包漏洞检查的 maven 插件 dependency-check-m…...
2. 下载rknn-toolkit2项目
官网链接: https://github.com/airockchip/rknn-toolkit2 安装好git:[[1. Git的安装]] 下载项目: git clone https://github.com/airockchip/rknn-toolkit2.git或者直接去github下载压缩文件,解压即可。...
xhr、ajax、axois、fetch的区别
一、XMLHttpRequest (XHR)、AJAX、Axios 和 Fetch API 都是用于在不重新加载整个页面的情况下与服务器进行通信的技术和库。它们在处理超时、终止请求、进度反馈等机制上有一些显著的差异。以下是它们的详细比较: 1. XMLHttpRequest (XHR) XMLHttpRequest 是一种浏…...
【HuggingFace Transformers】OpenAIGPTModel源码解析
OpenAIGPTModel源码解析 1. GPT 介绍2. OpenAIGPTModel类 源码解析 说到ChatGPT,大家可能都使用过吧。2022年,ChatGPT的推出引发了广泛的关注和讨论。这款对话生成模型不仅具备了强大的语言理解和生成能力,还能进行非常自然的对话,…...
macOS安装Java和Maven
安装Java Java Downloads | Oracle 官网下载默认说最新的Java22版本,注意这里我们要下载的是Java8,对应的JDK1.8 需要登陆Oracle,没有账号的可以百度下。账号:908344069qq.com 密码:Java_2024 Java8 jdk1.8配置环境变量 open -e ~/.bash_p…...
SpringBoot教程(安装篇) | Elasticsearch的安装
SpringBoot教程(安装篇) | Elasticsearch的安装 一、确定Elasticsearch版本二、下载elasticsearch(windows版本)官网下载如何解压配置 允许 别人跨域 访问自己启动运行 三、Es可视化工具安装(elasticsearch-head&#…...
前端登录鉴权——以若依Ruoyi前后端分离项目为例解读
权限模型 Ruoyi框架学习——权限管理_若依框架权限-CSDN博客 用户-角色-菜单(User-Role-Menu)模型是一种常用于权限管理的设计模式,用于实现系统中的用户权限控制。该模型主要包含以下几个要素: 用户(User)…...
【Tools】大模型中的自注意力机制
摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样 🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一…...
PhotoZoom Classic 9软件新功能特性及安装激活图文教程
PhotoZoom Classic 9这款软件能够对数码图片进行放大,而且放大后的图片没有任何的品质的损坏,没有锯齿,不会失真,如果您有兴趣的话可以试试哦! PhotoZoom Classic 9软件新功能特性 通过屡获殊荣的 S-Spline XL 插值…...
【数据结构】直接插入排序
目录 一、基本思想 二、动图演示 三、思路分析 四、代码实现 五、易错提醒 六、时间复杂度分析 一、基本思想 直接插入排序(Straight Insertion Sort)是一种简单直观的排序算法,其基本思想是: 把待排序的一个记录按其关键码…...
G-Helper完整指南:轻量级华硕笔记本控制工具,开源替代Armoury Crate的明智之选
G-Helper完整指南:轻量级华硕笔记本控制工具,开源替代Armoury Crate的明智之选 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, S…...
【肾结石检测】图像处理技术检测超声图像中的肾结石【含Matlab源码 15553期】含报告
💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…...
Warcraft Helper终极指南:8大功能让魔兽争霸3在现代系统重获新生
Warcraft Helper终极指南:8大功能让魔兽争霸3在现代系统重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在Window…...
终极指南:使用RPFM免费工具快速制作《全面战争》游戏模组
终极指南:使用RPFM免费工具快速制作《全面战争》游戏模组 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://…...
显存节省68%、训练加速2.3倍,DeepSeek-R1微调实测报告,中小团队必看的轻量化方案
更多请点击: https://intelliparadigm.com 第一章:DeepSeek-R1微调的轻量化价值与适用场景 DeepSeek-R1作为一款高性能开源推理模型,其架构设计天然支持参数高效微调(PEFT),在保持原始推理能力的同时显著降…...
粒子滤波算法在非线性估计中的应用【附程序】
✨ 长期致力于非线性系统、参数估计、递归贝叶斯估计、粒子滤波算法、重采样、相关系数、谐波模型研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于…...
GetQzonehistory:免费永久保存QQ空间说说的终极解决方案
GetQzonehistory:免费永久保存QQ空间说说的终极解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心QQ空间里那些珍贵的青春记忆会随着时间流逝而消失&…...
【ChatGPT商业计划书写作避坑手册】:基于216份真实BP评审数据,揭示投资人3秒淘汰BP的底层逻辑
更多请点击: https://kaifayun.com 第一章:ChatGPT商业计划书的核心价值定位 ChatGPT商业计划书并非通用技术方案说明书,而是面向特定商业场景的价值契约——它精准锚定AI能力与企业增长杠杆之间的耦合点,将大语言模型的泛化智能…...
Golang JWT生产实践:时间精度、密钥轮换与Refresh Token安全设计
1. 这不是“加个Token就完事”的简单活儿 Golang领域JWT——这六个字背后,藏着太多人踩过坑、重写过三遍、上线后半夜被报警电话叫醒的真实故事。我第一次在生产环境用JWT做身份验证时,自信满满地照着某篇教程写了20行代码,结果上线第三天&am…...
VisualGGPK2终极指南:轻松管理《流放之路》游戏资源的完整教程
VisualGGPK2终极指南:轻松管理《流放之路》游戏资源的完整教程 【免费下载链接】VisualGGPK2 Library for Content.ggpk of PathOfExile (Rewrite of libggpk) 项目地址: https://gitcode.com/gh_mirrors/vi/VisualGGPK2 VisualGGPK2是一款专为《流放之路》(…...
