Android Handler同步屏障:深入解析

Android Handler同步屏障:深入解析

在Android开发中,HandlerMessageQueue是处理线程间通信的重要组件。除了常见的消息发送和处理功能,Handler还提供了一个高级特性:同步屏障。本文将深入探讨这一特性,包括它的工作原理、应用场景,并提供实际的代码示例。

同步屏障机制简介

同步屏障是MessageQueue中的一种特殊机制,用于临时阻塞消息队列中的消息处理。当设置同步屏障时,它会阻止所有普通消息的处理,同时允许立即消息(例如带回调的消息或Runnable对象)继续执行。

工作原理

设置同步屏障

同步屏障通过在MessageQueue中插入一个特殊的、没有目标Handler的消息来实现。这个屏障阻止了所有后续的普通消息处理。

处理立即消息

尽管存在同步屏障,但某些类型的消息(如带有回调的消息或Runnable)仍然可以被执行。这些消息通常不受时间戳的约束,因此可以越过屏障处理。

移除同步屏障

当同步屏障被移除后,之前被阻塞的普通消息将恢复处理。

应用场景

同步屏障在以下情况下非常有用:

  • 确保立即任务优先处理:在需要优先执行某些紧急任务时,可以使用同步屏障暂时阻止其他消息的处理。
  • 避免死锁和资源竞争:在复杂的消息交互场景中,使用同步屏障可以防止因消息处理顺序不当引发的死锁或资源竞争。

代码示例

假设我们有一个Handler,我们想要在处理一些紧急任务前暂时阻止其处理其他消息:

// 创建Handler和MessageQueue
Handler handler = new Handler(Looper.getMainLooper());// 设置同步屏障
MessageQueue queue = Looper.getMainLooper().getQueue();
Field field = MessageQueue.class.getDeclaredField("mMessages");
field.setAccessible(true);
Message barrier = Message.obtain();
barrier.what = MessageQueue.MSG_SYN_BARRIER;
queue.enqueueMessage(barrier, System.currentTimeMillis());// 添加一个立即执行的任务
handler.post(() -> {// 紧急任务代码
});// 移除同步屏障
handler.postDelayed(() -> {field.set(queue, barrier.next);barrier.recycle();
}, 1000);

注意事项

使用同步屏障时需谨慎,因为不恰当的使用可能会导致消息处理的延迟或阻塞,影响应用性能和响应能力。

总结

Handler的同步屏障是Android中一个强大但不太为人知的特性,它可以用于控制消息队列中的消息处理顺序。正确使用同步屏障可以在复杂的消息处理场景中带来显著的好处,但需要确保恰当使用以避免潜在的问题。通过本文的讲解和代码示例,希望能帮助你更好地理解和应用这一高级特性。

当Vsync信号到来时,会往主线程的MessageQueue中插入一条异步消息,由于在scheduleTraversals中给MessageQueue中插入了同步屏障消息,那么当执行到同步屏障时,会取出异步消息执行。

屏障消息和普通消息的区别是屏障消息没有target属性,普通消息有target属性是因为要将消息分发给target指向的handler处理
屏障消息会插入到MessageQueue中合适的位置,这个消息以后的普通消息将被屏蔽
postSyncBarrier返回一个int类型的数值,通过这个数值可以撤销屏障
postSyncBarrier方法是私有的,如果我们想调用它就得使用反射
插入普通消息会唤醒消息队列,但是插入屏障不会

源码处理过程中会先判断此消息是否为屏障消息,如果是屏障消息,则去循环遍历,直到寻找到异步消息为止。通过这种方式跳过了普通消息,直接执行异步消息。也就是说同步屏障为handler消息机制提供了一种优先级策略,异步消息的优先级要高于同步消息。

另外需要注意的是:同步屏障不会自动移除,使用完成之后需要手动移除,不然会造成同步消息无法处理。也可以通过removeSyncBarrier(int token)方法进行移除,token就是之前添加屏障时返回的token。

对于绘制流程中,为什么要发送一个同步屏障并且发送异步消息,应该心中也有了答案,不错,就是为了让保证在vsync信号到来时,异步任务可以优先执行,从而绘制任务可以被及时执行,避免造成界面卡顿。

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

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

相关文章

Matplotlib线形图的创建_Python数据分析与可视化

线形图的创建 绘制线形图设置颜色和风格设置坐标轴上下限设置图形标签 绘制线形图 在所有图形中,最简单的应该就是线性方程y f (x) 的可视化了。来看看如何创建这个简单的线形图。要画Matplotlib图形时,都需要先创建一个图形fig 和一个坐标轴ax。创建图…

Elasticsearch(ES)概述

文章目录 一.什么是Elasticsearch?1.正向索引和倒排索引2.Mysql和ES的概念对比3.安装elasticsearch、kibana 二.IK分词器三.索引库操作四.文档操作五.RestClient操作索引库1.初始化RestClient2.创建索引库3.删除索引库4.判断索引库是否存在 六.RestClient操作文档1.新增文档2.…

Python 新版来袭!3.12.0 安装教程!!

Python是一门面向对象的计算机程序设计语言,以简洁和优雅著称,可以用于网络爬虫、web开发、人工智能、机器学习、数据挖掘及分析等工作,是目前最受欢迎的编程语言之一。 目前常见的Python版本有Python2和Python3,Python3不向下&a…

测试用例设计方法-场景法详解

01 定义 场景法是通过运用场景来对系统的功能点或业务流程的描述,从而提高测试效果的一种方法。 场景法一般包含基本流和备用流,从一个流程开始,通过描述经过的路径来确定的过程,经过遍历所有的基本流和备用流来完成整个场景。 …

北美区域性确定性预测系统平均温度数据

区域确定性预测系统(RDPS) 区域确定性预测系统 (RDPS) 进行物理计算,以 10.0 公里网格(1/11 度)空间分辨率对当天到未来 48 小时内的大气元素进行确定性预测。平均温度数据覆盖北美,由加拿大气象局 (MSC) …

【STM32】GPIO输入

1 GPIO输出 1.1 按键简介 按键:常见的输入设备,按下导通,松手断开 按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动 1.2 传感器模块简介 传感器模块&#xff…

LearnTheArchitecture-MemoryManagement

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 — 适合小白入门【目录】ARMv8/ARMv9架构高级进阶-[目录]👈👈👈 — 高级进阶、小白勿买【加群】ARM/TEE…

day02 hive 实操练习

一、某高校图书管理系统中有如下三个数据模型: create table book( book_id string, sort string, book_name string, writer string, output string, price decimal(10,2));INSERT INTO TABLE book VALUES (001,TP391,information_processing,author1,machinery_i…

redis优化秒杀和消息队列

redis优化秒杀 1. 异步秒杀思路1.1 在redis存入库存和订单信息1.2 具体流程图 2. 实现2.1 总结 3. Redis的消息队列3.1 基于list实现消息队列3.2 基于PubSub实现消息队列3.3 基于stream实现消息队列3.3.1 stream的单消费模式3.3.2 stream的消费者组模式 3.4 基于stream消息队列…

XmlElement注解用在Java的列表属性上产生的效果

例如,下面的代码,XmlElement注解用在了Conditions类的conditionList属性的getter方法上,其中conditionList是一个列表类型: package com.thb;import java.util.List;import jakarta.xml.bind.annotation.XmlAttribute; import ja…

Python面经【4】

Python面经【4】 一、什么是闭包二、[列表]和(元组)的区别三、__Init__和__new__的区别四、Python里match与search的区别五、创建百万级实例如何节省内存六、18. 4G内存如何读取一个5G的数据 一、什么是闭包 闭包指的是在函数内部定义了另一个函数,并返回了这个作为…

香港服务器显示美国 IP 地址是怎么回事

香港服务器显示美国 IP,在我们选择免备案服务器时会考虑很多影响因素,其中香港服务器有着省时省力,方便速度快等优 势受到大多用户喜爱,可有的时候在选择香港服务器时发现,有的香港服务器在 IP 地址一栏会显示其它国家…

leetcode每日一题34

89.格雷编码 观察一下n不同时的格雷编码有什么特点 n1 [0,1] n2 [0,1,3,2] n3 [0,1,3,2,6,7,5,4] …… 可以看到nk时,编码数量是nk-1的数量的一倍 同时nk编码的前半部分和nk-1一模一样 nk编码的最后一位是2k-1 后半部分的编码是其对应的前半部分的对称的位置的数字…

如何使用OpenCV转换图像并创建视频,实现Ken Burns特效

一、Ken Burns特效 当使用OpenCV时,最常使用的是图像,但是我们也可以多个图像创建动画,通过引入时间轴更容易可视化。 Ken Burns特效这是一种以电影制片人肯伯恩斯 (Ken Burns) 命名的平移和缩放技术,Ken Burns 效果不是在屏幕上显示大型静态照片,而是裁剪细节,然后平移图…

vue3(四)-基础入门之 fetch 与 axios

一、fetch 1、axios和fetch的区别 Axios 和 Fetch 都是 JavaScript 中用于发送 HTTP 请求的 API,它们的主要区别在以下方面: 1.Axios 支持更广泛的浏览器和 Node.js 版本,而 Fetch 只能在较新的浏览器中使用,或需要使用 polyfi…

[动态规划] 回文子串

回文子串 题目描述 给定一个字符串,输出所有回文子串。 回文子串即从左往右输出和从右往左输出结果是一样的字符串 比如: abba cccdeedccc都是回文字符串 我们要查找的子串长度应该大于等于2 关于输入 输入是一行,即可一个字符串。长度…

vr红色教育虚拟展馆全景制作提升单位品牌形象

720全景展馆编辑平台以其独特的优势,为展览行业带来了革命性的变革。这种创新的技术应用为参展商提供了更高效、更便捷、更全面的展示解决方案,进一步提升了展览行业的水平和影响力。 一、提升展示效果,增强品牌形象 720全景展馆编辑平台通过…

使用conan包 - 工作流程

使用conan包 - 工作流程 主目录 conan Using packages1 Single configuration2 Multi configuration 本文是基于对conan官方文档Workflows的翻译而来, 更详细的信息可以去查阅conan官方文档。 This section shows how to setup your project and manage dependenci…

32 - MySQL调优之事务:高并发场景下的数据库事务调优

数据库事务是数据库系统执行过程中的一个逻辑处理单元,保证一个数据库操作要么成功,要么失败。谈到他,就不得不提 ACID 属性了。数据库事务具有以下四个基本属性:原子性(Atomicity)、一致性(Con…

Windows全系列 本地密码暴力破解

首先 咱们要准备两个工具: 第一个是 pwdump-master 第二个是 saminside_softradar-com.exe这两个工具 我会一并上传 需要的同学 可以自取本文章操作思路是: 第一步 首先把我刚刚提到的两个软件 以某种手段放置于机器中 如果是真实机 就用U盘 拷贝到真实机…