延时消息_Handler的消息延时是怎么实现的

  • 消息延时做了什么特殊处理?

  • 是发送延时,还是消息处理延时?

  • 延时的精度如何?

8332123219d856f5fb2db96bf8226640.png

通常我们使用Handler的消息延时都是调用sendMessageDelayed函数实现的,其中delayMillis是需要延时的毫秒。

5953061f283bcec2e0922a2a05c5983c.png

通过跟踪sendMessageDelayed函数可以发现,最终是调用到了上面这个enqueueMessage方法,其中消息队列mMessages是单链表数据结果。

从上面的源码中可以看到,当前出入的消息msg时,首先判断mMessages消息队列中的第一个消息mMessages.prev,要是当前队列中消息为空,或者msg立即发送,则将该消息插到消息队列mMessages的头部;反之,则会在一个for的死循环中遍历消息队列并将传入消息msg插到单链表中合适的位置。事实上,消息队列是按照消息处理的时间when,按照从近到远的顺序排列的,最先要执行的任务放在消息队列的头部,依次排列。

从上面可以看到,Handler中sendMessageDelayed方法只是将消息按照要执行的先后顺序插入到消息队列中的,插入好了并不意味着就会按照设定的延时时间处理消息,那Handler时如何延时处理该消息的呢?

首先我们知道,Looper.loop()之后,线程就进入了消息监听的阶段:

ca819099f924e19957d6015d4ac985a1.png

当Handler中没有可用消息的时候,上面代码会一直阻塞在queue.next()的地方,直到消息返回,才会调用dispatchMessage进行消息的处理,要是返回的msg为空,那么Handler就会结束消息监听,不再监听任何消息。

我们来看看queue.next()函数:

d0db5960aeb93fb20e40780d5948a365.png

上面是阻塞的从消息队列中获取可用消息的过程。其中nativePollOnce方法是一个native方法,其内部会根据传入的nextPollTimeoutMillis,在延迟这么长时间之后唤醒线程从消息队列中读取消息,内部调用的是epoll_wait方法。

我们知道当线程中没有新消息要处理的时候,线程处于休眠状态,当其他线程向Handler的消息队列中写入消息,这一动作并不会唤醒当前线程处理该消息,还需要向线程的eventfd中写入数据,从而唤醒休眠的线程开始处理数据,此处也是一样的,nativePollOnce函数内部会调用epoll_wait方法,设置超时时间为nextPollTimeoutMillis,epoll_wait在这个超时时间之后,就会唤醒线程,开始处理消息队列中的消息。

next方法中,每次会从消息队列mMessages中获取链表中头部的消息,要是头部消息的设定执行的时间要比当前时间大,说明消息队列中所有的消息都还没有到可执行的时间,这是因为消息队列中消息在插入消息队列的时候,按照执行时间的先后顺序已经排序好了。这种情况下,会计算出一个等待时间,传递到nativePollOnce函数中,让native层在这个等待时间之后再唤醒线程读取消息队列中的消息,进行消息处理。

Handler的消息延时的实现:

消息队列在插入消息的时候是按照消息的触发时间顺序排序的,先执行的消息放在单链表的头部,最后执行的消息放在单链表的尾部;

在消息执行的过程中,通过native层设置epoll_wait的超时事件,使其在特定时间唤醒线程开始出现消息。

关于延时精度:Handler的延时精度并不高,会受到前一个消息处理时间的影响,因为在Looper.loop()方法中,只有上一个消息被处理完之后,才会去queue中读取下一个消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4 关卡流 进阶_全息武器全解析,记住4个点全区第一就是你!

实不相瞒,每次看着全息武器糖糖都感觉自己像钢铁侠高端大气上档次,低调奢华有内涵那么问题来了!这个全息武器究竟该怎么玩才能成为真正的钢铁侠?我的使命之全息武器【作者:D38激战阿曼——潜龙小生】全息武器在属性增加…

【渗透过程】嘉缘网站 --测试

声明:本片文章测试网站为测试靶场 信息收集阶段: 首先使用了一些常见的扫描工具:nmap 御剑 使用nmap扫描端口 发现网站开放了 135 139 445 3306 等端口 这里可以看到网站开放了一些危害较高端口:135 225等 使用御剑扫描到一些敏感…

文档过期打不开怎么办_标准的产品需求文档在这里!(详细说明版)(2)

接着上篇继续写,上篇请点击标准的产品需求文档在这里!(详细说明版)(1)入口已经写完,读此文档的无论是研发人员还是测试都已经知晓此需求需要做的从哪里进入,接下来就是主菜了,进入以后该干嘛。进入以后当然就是新的页面…

Macbook全系列详细分析及购机指南

时至今日,极佳的用户体验、强大的功能、独特的设计感、广阔的市场和无可比拟的品牌魅力已经让苹果公司各种电子产品的迅速普及,其中Macbook逐渐被越来越多的人所青睐,尤其是从事一些特定行业的工作者(比如IT、电信、互联网以及艺术…

惠普m1005连接电脑步骤_电脑连接电视机详细步骤方法图文

电脑连接电视机有什么好处呢?小编想到了几点,那就是屏幕大,而且可以在电视机上使用网络看到自己想看的剧。还有就是可以更多的人一起做着来看。所以总的来说电脑连接电视机还是好处比较多的。下面我就来告诉你们电脑怎么连接电视机。有的时候…

对程序实施精准手术!阿里安全猎户座实验室首创“自动逆向机器人”

近日举办的看雪安全开发者峰会上,阿里安全猎户座实验室首度向外界展示了最新的研究成果——“自动逆向机器人”。该机器人可以像医生一样“望闻问切”,对程序进行显微镜级别的勘察,并完整“回放”其运作过程,因此,可以…

《魔兽世界》的魅力究竟在哪儿?

写在前面:《魔兽世界》(World of Warcraft,后面简称WOW),是由暴雪开发的一款大型角色扮演网络游戏,曾经付费的正式用户一度超过1150万人,覆盖244个国家和地区,是曾经的“世界第一网游…

Service Mesh所应对的8项挑战

2019独角兽企业重金招聘Python工程师标准>>> Lori Macvittie 微服务架构是把双刃剑,我们享受它带来的开发速度(development velocity),却也不得不面对服务间通讯带来的复杂性问题。 目前大多数扩展容器化微服务的架构多…

什么叫内部银团_什么是紫钛晶?紫钛晶是不是天然水晶?

都说紫钛晶是紫水晶与钛晶的结合,听上去好像这种水晶不是天然的,像是人工合成的,事实上并非如此,紫钛晶也是天然形成的水晶,由于内部的包裹体是金色的,因此被称为紫钛晶。和菩心晶舍家的晶舞倾城一起了解紫…

如何使用Squid服务来构建=》传统和透明代理服务器,通俗易懂!

1、缓存代理概述: 作为应用层的代理服务软件,Squid主要提供缓存加速和应用层过滤控制的功能 2、代理的工作机制: (1)当客户机通过代理来请求web页面时,指定的代理服务器会先检查自己的缓存,若缓…

Bootstrap开发框架视频整理

最近到客户处进行实地培训,整理了很多培训的材料,现将它们录制相关主题的视频,作为我的Bootstrap开发框架的知识补充,希望给感兴趣的朋友进行了解。培训内容主要包括基础框架部分、MVC框架部分、Bootstrap框架部分、Bootstrap重要…

【c基础】入门语法

%d:占位符 表示要输出一个整形数。 %f:为float 浮点数 %lf:为double型 双精度浮点数 \n:换行 const:定义一个常量,一旦被初始化就不能修改,只读的变量(read-only variable)。 整数运算 的结果是整数 如果有小数就抛弃没有考虑四舍五入。 一&a…

day22 Java学习 IO流(序列流)

IO流(序列流) 序列流: * 可以把多个字节输入流整合成一个,从序列流中读取数据时,将从被整合的第一个流开始读,读完一个之后继续读第二个。 整合方式: * Seq uenceInputStream ( InputStream &am…

Unraveling the JPEG file

(文章还剩实践部分没写,答辩过后补上...) JPEG文件在当下数字化生活中是无处不在的,但是在熟悉的JPEG面纱背后,隐藏着一些算法,它们去除了人类眼中无法察觉到的细节。这产生了最高的视觉质量与最小的文件大小。让我们来看看这一算…

mysql interval 3 day_Mysql之INTERVAL与DATE_SUB与EXTRACT函数的使用

1. INTERVALINTERVAL代表的是时间间隔MySQL中的时间间隔类型有如下几种:1.1 利用INTERVAL做时间的加减法示例:加法:SQL>SELECT DATE 2018-11-01 INTERVAL 10 11 DAY_HOUR;结果:2018-11-11 11:00:00减法:SQL> select date 2018-11-11 11:00:00 -INT…

0727日志

为什么80%的码农都做不了架构师?>>> c端线上地址 http://x.diandanme.com/fe/?d183#/ 什么时候来需求,我做好准备了吗? eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC94LmRpYW5kYW5tZS5jb21cL2FwaVwvd2VjaGF0XC…

Python基础学习总结__Day3

一、集合 1.特性:无序且天生去重,格式为{} 2.作用: (1)去重 (2)关系测试 3.可调用函数(常见对列表操作) (1)取…

day8网络编程,面向对象1

一.只是回顾 1.导入模块的顺序,首先从当前目录下找,再从环境变量里面找,使用"sys.path.insert(0,需要导入的环境变量)"加入需要导入文件的环境变量; 2.如果不同项目中有相同的文件,需要导入文件,需要将非当前项目中右键添加的环境变量取消,将当前的环境变量添加上去;…

ES语法及-IK分词器

{"query": {"query_string": {"default_field": "title",//全文搜索"query": "器大"}} } "id":1, "title":"Elasticsearch是一个基于Lucene的搜索服务器", "content":&q…

python多任务编程_python线程的多任务编程

多任务多任务介绍对于人来说,一边听歌,一边跳舞就是多任务。对于电脑,简单的说,同一时间执行多个程序处理数据叫做多任务多任务理解单核CPU单核cpu在处理多任务的时候是根据时间片轮转的方式进行的,比如执行QQ1us&…