延时消息_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,一经查实,立即删除!

相关文章

5月JC学习总结

断剑重铸之日,王者归来之时。为了更美好的明天而战。 五月 悄悄地过了 人儿 不觉中散了 携着一腔热血;来到蛟川 来到机房 微凉的轻风,无声地去了 炽热的骄阳,即将要落了 站在4楼,向窗外眺望,映出的不是夕阳…

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

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

terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr

运行时报错: terminate called after throwing an instance of std::out_of_rangewhat(): basic_string::substr:__pos Aborted (core dumped) 内存读取越界。 解释1:for example:const std::string sTest( "test" );sTest.substr…

记一次理想浪漫的毕旅

因为临近毕业离别的氛围和闲散的生活,虽然手头积攒了不少可写的素材和教程,但还是两个月没有在CSDN更新博客。论文答辩之后,我只是每天在宿舍玩玩电脑、打打扑克,唯一让我难受的是,隔几天便送走一位同窗好友。有时甚至…

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

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

C编程经验总结

Turbo c Return (z);return z; 图形界面的有scanf(“%d ~%d\n”,&~,&~);注意:中间不能有乱的东西 Printf(“~~~ %d~~%d\n”,~,~);这儿可以有乱的东西,一切的提示图形界面多是由它完成 函数,变量一定是有类型 除了函数(&am…

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

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

day32

udp(用户数据包协议) 高并发(同时有大量客户端访问服务器,服务器处理不过来)​OSI模型中,属于传输层得协议,仅用于不要求可靠性,以及不要求分组顺序且数据量较小的简单传输,力求快​通讯流程类似对讲机 只管发送不管对方是否接收到,甚至不关心对方存在​UDP可以处理多个客户端,…

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

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

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

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

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

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

(24) 不可能的出栈顺序

一、问题描述 给定两个数组,一个进栈顺序,一个出栈顺序。判定出栈数组的出栈顺序是不是有可能的。 二、Code 1 package algorithm;2 3 import java.util.ArrayDeque;4 import java.util.Deque;5 6 /**7 * Created by adrian.wu on 2019/5/30.8 */9 pub…

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

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

Service Mesh所应对的8项挑战

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

stm32cubeide外部中断_【STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)

前言上一节我们讲解了STM32CubeMX的基本使用和工程的配置,那么这一节我们正式来学习CubeMX配置STM32的各个外设功能了今天我们会详细的带你学习STM32CubeMX配置外部中断,并且讲解HAL库的GPIO的各种函数,带你学习不一样的STM32那么话不多说&am…

html5兼容ie

https://www.jb51.net/html5/143049.html转载于:https://www.cnblogs.com/rivsidn/p/10913532.html

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

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

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

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

排序算法-C++实现

#include <iostream>using namespace std;void show(int M[], int n) {for(int i0; i<n; i)cout<<M[i]<<" ";cout<<endl; }//快速排序 void quick_sort(int M[], int left, int right) {if(left < right){int i,j,x;i left;j right;…

Bootstrap开发框架视频整理

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