Handler系列-怎么实现delay
1.前提
前面说到sendMessage携带的delay会被加上SystemClock.uptimeMillis() ,最终赋值给Message的when。
msg.when = SystemClock.uptimeMillis() + delayMillis;
那么when除了用来在链表里面作为排序依据以外,还在哪里用到了呢?
2.Looper.loop
首先看下Looper的loop里面,循环取queue的msg,如果msg为null,返回;否则执行msg
public final class Looper {public static void loop() {final Looper me = myLooper();final MessageQueue queue = me.mQueue;for (;;) {Message msg = queue.next(); // might block 获得下一个消息if (msg == null) {// No message indicates that the message queue is quitting.return;}msg.target.dispatchMessage(msg); //执行Messagemsg.recycleUnchecked(); //msg放入缓存}}
}
3.MessageQueue.next
看下queue.next()的实现,会通过when计算下一条消息需要等待的时长。
nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE);
public final class MessageQueue {Message next() {// Return here if the message loop has already quit and been disposed.// This can happen if the application tries to restart a looper after quit// which is not supported.final long ptr = mPtr;if (ptr == 0) {return null;}int pendingIdleHandlerCount = -1; // -1 only during first iterationint nextPollTimeoutMillis = 0; //下一条消息等待的时长for (;;) {if (nextPollTimeoutMillis != 0) {Binder.flushPendingCommands();}//等待nextPollTimeoutMillis,不往下执行nativePollOnce(ptr, nextPollTimeoutMillis);//时间到了synchronized (this) {// Try to retrieve the next message. Return if found.final long now = SystemClock.uptimeMillis();Message prevMsg = null;Message msg = mMessages;if (msg != null) {if (now < msg.when) { //当前时间小于when// Next message is not ready. Set a timeout to wake up when it is ready.nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE); //等待时长} else {// Got a message.mBlocked = false;if (prevMsg != null) {prevMsg.next = msg.next;//将msg从链表中移除} else {mMessages = msg.next; //更新表头}msg.next = null;msg.markInUse();return msg;}} else {// No more messages.nextPollTimeoutMillis = -1;} }// Run the idle handlers.// We only ever reach this code block during the first iteration.for (int i = 0; i < pendingIdleHandlerCount; i++) {final IdleHandler idler = mPendingIdleHandlers[i];mPendingIdleHandlers[i] = null; // release the reference to the handlerboolean keep = false;try {keep = idler.queueIdle();} catch (Throwable t) {Log.wtf(TAG, "IdleHandler threw exception", t);}if (!keep) {synchronized (this) {mIdleHandlers.remove(idler);}}}// Reset the idle handler count to 0 so we do not run them again.pendingIdleHandlerCount = 0;// While calling an idle handler, a new message could have been delivered// so go back and look again for a pending message without waiting.nextPollTimeoutMillis = 0;}}
}
相关文章:
Handler系列-怎么实现delay
1.前提 前面说到sendMessage携带的delay会被加上SystemClock.uptimeMillis() ,最终赋值给Message的when。 msg.when SystemClock.uptimeMillis() delayMillis; 那么when除了用来在链表里面作为排序依据以外,还在哪里用到了呢? 2.Looper…...
C++前缀和算法的应用:最大化城市的最小供电站数目
本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 二分法 题目 给你一个下标从 0 开始长度为 n 的整数数组 stations ,其中 stations[i] 表示第 i 座城市的供电站数目。 每个供电站可以在一定 范围 内给所…...
Centos/Linux安装Apahce出现bug汇总
源码安装Apache软件 使用软件:Apahce2.4.58,apr1.5.2, apr-util1.5.4 1.下载apr、apr-util和Apache软件; 2.安装apr压缩包,步骤如下: 第一、解压缩 tar zxvf apr-1.5.2.tar.gz第二、安装 cd /usr/local/sr…...
Scrapy爬虫异步框架(一篇文章齐全)
1、Scrapy框架初识 2、Scrapy框架持久化存储(点击前往查阅) 3、Scrapy框架内置管道(点击前往查阅) 4、Scrapy框架中间件(点击前往查阅) Scrapy 是一个开源的、基于Python的爬虫框架,它提供了…...
基于Hadoop架构的多重分布式BP神经网络的短期负荷预测方法
点我完整下载:基于Hadoop架构的多重分布式BP神经网络的短期负荷预测方法.docx 基于Hadoop架构的多重分布式BP神经网络的短期负荷预测方法 "A Short-term Load Forecasting Method based on Multi-distributed BP Neural Network Architecture with Hadoop Fram…...
Oracle查询数据库中当前用户每个表的数据条数
Oracle查询数据库中当前用户每个表的数据条数 select t.table_name,t.num_rows from user_tables t一般情况下这条语句就可查出想要结果 如果不行 请执行以下脚本 create or replace function count_rows(table_name in varchar2,owner in varchar2 default null)return…...
Windows从源码构建tensorflow(离线编译)
由一开始的在线编译,到后面的离线编译,一路踩坑无数,历经整整6个半小时,终于编译成功!在此记录一下参考过的文章,有时间整理一下踩坑记录。 一、环境配置 在tensorflow官网上有版本对应关系 win10 bazel …...
JMeter处理接口签名sign
写接口脚本的时候,很多接口涉及到签名,今天介绍下用JMeter编写签名脚本的方法。 举个例子,开启红包接口,请求方式为post POST /v1/api/red/open json请求参数 { "red_id":1, "timestamp":"1667033841…...
Android : Java中创建线程的几种方式_简单应用
主方法 MainTest.java package com.example.mythread;import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;public class MainTest {public static void main(String[] data){ // 以下的方…...
C# Onnx 特征匹配 DeDoDe 检测,不描述---描述,不检测
目录 介绍 效果 模型信息 项目 代码 下载 介绍 github地址:https://github.com/Parskatt/DeDoDe DeDoDe 🎶 Detect, Dont Describe - Describe, Dont Detect, for Local Feature Matching The DeDoDe detector learns to detect 3D consisten…...
第十六章 处理空字符串和 Null 值
文章目录 第十六章 处理空字符串和 Null 值空字符串和 Null 值的默认映射导出值控制空元素的形式 第十六章 处理空字符串和 Null 值 类和属性参数 XMLUSEEMPTYELEMENT XMLIGNORENULL XMLNILNOOBJECT XMLNIL 空字符串和 Null 值的默认映射 下表总结了空字符串和 null 值的…...
MYSQL 处理重复数据
文章目录 前言防止表中出现重复数据统计重复数据过滤重复数据删除重复数据在这里插入代码片后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱👓博主在前端领域还有很多知识和技术需要掌握,正…...
世岩清上:未来科技展览的策展视野
面对科技未来,策展视野的核心在于把握趋势,理解人性,并充分运用科技手段提升观众的体验。以下是我对未来科技展览的策展视野。 一、以人为本的设计理念 科技发展的最终目的是服务于人类,提升人们的生活质量。因此,展…...
如何理解2023vivo开发者大会,使用Rust语言编写蓝河操作系统(BlueOS)?
在2023年vivo开发者大会上,vivo宣布使用Rust语言编写其蓝河操作系统(BlueOS)。 什么是Rust语言? Rust 是一种开放源代码系统编程语言,可用于开发高效、安全的软件。 使用 Rust 可管理内存并控制其低级详细信息。 但你…...
Android flutter this and base files have different roots
类似经历者 Android build fails with certain plugins if project is in a different drive (from sdk) 错误描述 我是windows系统,下载 flutter sdk 我是放在D盘,flutter项目是放在E盘,flutter 执行 pub get的时候,会在我C盘…...
Excel动态选择某一行/列的最后一个数据
选择列的最后一个数据: 以A列为例,使用: LOOKUP(1,0/(A:A<>""),A:A)选择行的最后一个数据: 以第3行为例,使用: LOOKUP(1,0/(3:3<>""),3:3)示例程序 列最后一个数据&a…...
扫描条形码到电脑:Barcode to pc 4.6.3 Crack
像专业人士一样使用条形码将条形码发送到 PC 排名第一的智能手机扫描应用程序 将条形码即时发送到计算机程序并自动执行任务的最简单方法 受到全球 500,000 多名用户的信赖 条形码到 PC:Wi-Fi 扫描仪应用程序,条码到 PC:适用于 Android 和 i…...
从0到0.01入门 Webpack| 003.精选 Webpack面试题
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
[数据结构]-红黑树
前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、红黑树的…...
Android 13.0 Launcher3 app列表页桌面图标按安装时间排序
1.概述 在13.0的系统rom定制化开发中,在对Launcher3进行功能开发时,系统默认的app列表页排序是安装app名称进行排序的, 由于功能的需要要求按照app安装时间进行排序,这就需要找到相关的排序地方,进行排序方式的修改就能完成这个功能 2.Launcher3 app列表页桌面图标按安装…...
JPL 公式由来
目录 一、JPL 公式的历史背景 二、数学基础 三、单系数:C^≈Mm/4(JPL 原始版) 1. 数学最优与工程折衷 2. 误差分析(JPL 当年的验证) 四、两段式(JPL 改进版):Mm/8 与 Mm/2 五…...
ViGEmBus技术架构解析:Windows内核级虚拟游戏控制器驱动实现原理
ViGEmBus技术架构解析:Windows内核级虚拟游戏控制器驱动实现原理 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一个Windows内核模式…...
【每周分享】ADC芯片ADS1262测试记录总结和分享
最近使用ADC芯片ADS1262在做一些数据测试和调试,前前后后也测试了不少数据,今天就与大家分享一下测试记录的总结。一、 ADC芯片ADS1262的相关寄存器配置和数据测试记录 主要寄存器包括:1、POWER寄存器;2、INTERFACE寄存器&#…...
终极指南:3分钟掌握Ofd2Pdf免费OFD转PDF完整教程
终极指南:3分钟掌握Ofd2Pdf免费OFD转PDF完整教程 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 你是否经常遇到OFD格式文件无法打开、无法分享的烦恼?作为中国自主研发的电子…...
【四足机器人运动学实战】三维腿部建模:从几何视图到完整解算
1. 三维腿部建模的核心思路 第一次接触四足机器人腿部建模时,我被三维空间中的复杂几何关系绕得头晕。直到发现多视图分解法这个神器,才真正理解如何将三维问题降维打击。想象你正在玩积木:从正面看只能确定高度和宽度,从侧面看才…...
系统部署自动化
系统部署自动化:提升效率的关键利器 在数字化转型的浪潮中,系统部署自动化已成为企业提升运维效率、降低人为错误的核心技术。传统的手动部署方式不仅耗时耗力,还容易因操作失误导致系统故障。而自动化部署通过脚本和工具实现一键式操作&…...
3分钟搞定!APA第7版参考文献格式一键安装指南
3分钟搞定!APA第7版参考文献格式一键安装指南 【免费下载链接】APA-7th-Edition Microsoft Word XSD for generating APA 7th edition references 项目地址: https://gitcode.com/gh_mirrors/ap/APA-7th-Edition 还在为论文参考文献格式头疼吗?AP…...
有时候系统很卡是不是因为这个360
简单来说:Windows 可以杀死病毒,但很难杀死一个“用户请进来的、伪装成合法服务的商业软件”。让我们拆解一下为什么它能在 Windows 上“寄生”得如此成功:1. 核心原因:用户主动授予了它“最高权限”这是最根本的一点。360 不是病…...
AIAgent持续学习落地失败的7个隐性雷区(SITS2026闭门研讨会未公开纪要·仅限本次释放)
第一章:AIAgent持续学习的范式跃迁与现实断层 2026奇点智能技术大会(https://ml-summit.org) 传统机器学习系统依赖静态数据集与离线训练闭环,而现代AIAgent需在开放环境中边执行、边感知、边修正知识结构——这一能力要求正驱动持续学习从“模型微调”…...
【紧急预警】AIAgent服务注册中心已成单点瓶颈!4种去中心化治理方案对比实测(QPS提升3.8倍,延迟压降至8ms)
第一章:AIAgent架构服务治理方案 2026奇点智能技术大会(https://ml-summit.org) AIAgent系统在规模化部署中面临服务异构性高、生命周期动态性强、策略协同复杂等挑战,传统微服务治理模式难以支撑其可观测性、弹性扩缩与策略闭环能力。本章聚焦于构建面…...
