成都信用建设网站和外国人做古玩生意的网站

news/2025/9/26 4:22:37/文章来源:
成都信用建设网站,和外国人做古玩生意的网站,香河建设局网站,海口网站建设搜q.479185700原文链接 Android Sync Barrier机制 诡异的假死问题 前段时间#xff0c;项目上遇到了一个假死问题#xff0c;随机出现#xff0c;无固定复现规律#xff0c;大量频繁随机操作后#xff0c;便会出现假死#xff0c;整个应用无法操作#xff0c;不会响应事件#xff…原文链接 Android Sync Barrier机制 诡异的假死问题 前段时间项目上遇到了一个假死问题随机出现无固定复现规律大量频繁随机操作后便会出现假死整个应用无法操作不会响应事件会发生各种奇怪的ANR且trace不固定。非常之诡异。 经过大量的复现研究和分析 以及大神的指点后发现与同步屏障Sync Barrier有关系于是发现有必要研究一下这个东西。 什么是Sync Barrier机制 这是安卓线程消息队列里面的一个新增加的东西这么说还是太抽象我们从头说起这件事情 安卓的消息队列机制 消息队列或者叫做Event Loop通常在任何一个GUI应用程序里面都会有的应用大部分时间处于Idle状态当有事件发生时比如用户点了一个button然后开始响应此事件。安卓也是一个GUI应用程序绝大多数都是带有GUI的应用程序那么安卓 里面是如何实现这个EventLoop的呢它是用Looper和MessageQueue以及Handler以一种消息队列的方式来实现loop。 有一定经验的同学对这些东西肯定不陌生因为它们在实际的开发过程中相当常见比如说对于UI的操作只能放在主线程里面那么当工作线程想要更新UI时就需要用Handler发一个消息或者post一个Runnable。或者当你想延后一段时间执行某种操作就可以用postDelayed。这些都是非常常规的操作了。对于工作线程如果想启用消息队列就用Looper#prepare就可以了当然了要记得quit。 内部原理上面也不是很复杂就是Looper会给线程绑定一个消息队列即是MessageQueue这是一个无限循环的队列不断的轮询队列当有新的消息时就去处理否则就等待。主线程安卓框架层在创建应用进程的时候就会给主线程默认创建好MessageQueue所以就可以向其发消息sendMessage或者postDelayed它们本质上都是一样的都是向MessageQueue中入队一个消息稍后它便会得到处理。 同步消息与异步消息 这个MessageQueue机制就是队列也就是说符合队列的特点先进先出FIFOFirst-In First Out就是说你先post的消息肯定是先被处理后post的后处理即使有delay时候也是看谁先到谁先到谁先被处理。因此这里面的消息全是同步也就是说所有消息都是顺序处理这就是同步消息。 异步消息也就是说某个消息想被最高优先级处理无视发送消息的时机比如说队列里面有8个消息如何想让某个消息最先被处理这时队列就变成了优先队列有优先级的队列。那么具有高优先级的消息也是异步消息Asynchronous Message。即使是最后加入队列的但因为是异步消息它会被先处理并不是FIFO此可理解 为异步。 Sync Barrier用以实现优先队列 说了这么多Sync Barrier就是安卓 内部用以实现优先级队列的一种方式。 当队列中出现Sync barrier具体实现上就是Message#target为null时就会忽略所有同步消息寻找异步消息isAsynchrouns为true的消息然后优先处理它。 需要注意的是把消息标记为异步以及向消息队列中发送Sync barrier这些API全部都是hide的也就是说app中是无法使用的通过反射也许能调用成功但风险也较大后续会被谷歌限制调用。换言之这东西只能在Frameworks层内部自己使用。 为什么要有Sync Barrier 说了这么多其实本质上这东西就是一个优先队列给要处理的消息加一个优先级机制那这有什么实际用途呢 消息队列这东西是在安卓一诞生就有了的东西大部分时候它也没有什么问题。但有一个事情就是安卓操作系统的UI流畅度远不及水果平台iOS原因就是在于水果平台的UI渲染是整个系统中最高优先执行。 有同学会说安卓里面也是这样啊你想UI都只能在主线程里面操作因此主线程也叫UI线程。只能在主线程中操作UI就能保证UI渲染是最高优先级吗当然不是了。因为整个应用程序的默认线程就是主线程换句话说如果你不明显的去做线程切换或者启用工作线程那么所有事情都发生在主线程里面当然 也包括了UI渲染因此UI的渲染与你在主线程时面post一个消息的优先级是一样的。 如何让UI渲染在主线程中以最高优先级运行于是就有了Sync barrier机制这东西就是为了让消息队列有优先级并且没有开放给app使用。可以去看一下ViewRootImpl这货是专门负责ViewTree渲染的也即可以理解为负责UI渲染的的几个perform它都是异步消息也即会开启Sync barrier它发送的消息将会是最高优先级的会被优先处理。 主要在哪里用Sync barrier 前面提到了Sync barrier这玩意儿并不是给app开发同学用的很多相关的接口并没有开放出来这是为了提高UI渲染而设计的东西。因此这东西主要是用在了UI渲染过程中。 仔细查看ViewRootImpl的源码可以发现每次渲染View tree之前都会先给主线程插入一个Sync barrier以挡住同步消息以保证渲染被主线程优先执行到。 UnsupportedAppUsage(maxTargetSdk Build.VERSION_CODES.R, trackingBug 170729553)void scheduleTraversals() {if (!mTraversalScheduled) {mTraversalScheduled true;mTraversalBarrier mHandler.getLooper().getQueue().postSyncBarrier();mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);notifyRendererOfFramePending();pokeDrawLockIfNeeded();}}void unscheduleTraversals() {if (mTraversalScheduled) {mTraversalScheduled false;mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);mChoreographer.removeCallbacks(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);}}void doTraversal() {if (mTraversalScheduled) {mTraversalScheduled false;mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);performTraversals();}}这里的逻辑略复杂一些View tree本身的处理过程也即三大步measure, layout和draw也就是performTraversal本身并没有异步消息它是在准备渲染的时候放一个sync barrier而在具体处理每一帧前就移除了sync barrier这里为何要这样还没有完全想清楚。通过搜索ViewRootImpl可以发现只有input eventkeyevent 以及与用户输入相关的消息被设置为了asynchronous也就是说用户事件响应被提高了优先级而view tree的渲染即UI的每一帧其实并没有被提升优先级。因为UI刷的每一帧是以固定频率刷新的Choreographer 从硬件得到vsync脉冲信号然后回调给ViewRootImpl让其渲染每一帧也即是performTraversal。 Sync Barrier会引发什么问题 说实话这套机制实现的并不怎么优雅因为毕竟它并不是在最初的设计之初就考虑到的东西它的整体运行机制并不完善非常依赖于调用者的使用所以它的相关API并未有开放出来。 它有三步先发一个Sync barrier然后发送异步消息然后再移除Sync barrier。 只有UI渲染ViewTree的相关操作才需要这样做大部分其他的消息都是同步的并不需要这样搞。当有Sync barrier时消息队列在处理消息的时候会忽略掉所有的同步消息也即是常规消息优先处理异步消息直到Sync barrier移除也是需要手动移除的。Sync barrier需要手动移除是最坑的。 因此假如要处理的异步特别多或者逻辑出错Sync barrier没有被移除那就悲剧 了就会导致消息队列中的大量常规消息无法得到处理队列就会停止工作应用会出现随机的ANR以及假死。 如何调试 很不幸Sync barrier导致的问题很难调试甚至很难被发现通常都是ANR或者说卡死问题。 那么首先可以按照ANR和卡死的常规分析方式去分析假如都未发现明显的问题时比如没有明显的耗时的操作也没有死锁也没有被硬件和IO阻塞也没有进入死循环。 这些常规的分析都没有发现问题。这时就可以考虑是不是Sync barrier在搞鬼。特别当涉及一些诡异的UI状态时比如某个View只显示 了一半比如某一个View没有显示 完全比如只有背景没有前景等等当排除了其他常规问题时就很可能是Sync barrier有异常导致的。 另外如果有能力修改Frameworks的话可以给MessageQueue增加dump信息把队列中的所有消息都打印出来以及把Sycn barrier也都打印出来这样能够比较清楚看到队列内部的情况自然也能够发现异常的Sync barrier。 如何避免Sync Barrier搞鬼 前面提到过这套东西都是Frameworks层内部的机制并没有开放给app使用而Frameworks内部的逻辑一般来说还是相当健壮的绝大多数时候并不会出问题。当然了各个厂商内部搞的各种所谓优化倒是有可能会引发问题。 在实际开发过程中引发Sync barrier的最多场景就是自定义View。对于自定义View是能够在非主线程调用其invalidate的当有大量的非主线程调用invalidate时就有可能恰好与主线程的渲染发生交互具体case非常corner要刚巧非主线程在postInvalide然后主线程也刚巧在发送异步消息就可能使得Sync barrier没有被移除从而导致问题。 这就需要我们在编码阶段做好封装对于自定义View的刷新触发逻辑做好封装做一下线程切换以保证是在主线程里面执行invalidate。因为暴露出去的接口是没有办法控制的你没有办法让所有调用者都在主线程里面调用你的接口。 参考资料 Handler sync barrier同步屏障Android 同步屏障机制(Sync Barrier)同步屏障阻塞唤醒和我一起重读 Handler 源码同步屏障与异步消息从入门到放弃面试官如何提高Message的优先级今日头条 ANR 优化实践系列 - Barrier 导致主线程假死 原创不易打赏点赞在看收藏分享 总要有一个吧

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

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

相关文章

做玄幻封面素材网站工程人才招聘网

求素数是比较基本的内容,有时候我们会需要打一个素数表。一般如果n比较小我们会使用(%2~sqrtn)这种算法,简单但是时间耗费很多,复杂度是O(n^2)。这里介绍一种筛选求素数法,基本要点是,如果找到一…

北京谁会做网站开发做跨境的网站有哪些

系统守护进程(服务) •服务就是运行在网络服务器上监听用户请求的进程 •服务是通过端口号来区分的 常见的服务及其对应的端口 1.ftp:21 FTP指的是文件传输协议,它是用于在计算机网络上进行文件传输的标准网络协议。通过FTP&am…

做电影网站被告版权网站备案做网站必须

​开放式耳机在如今社会中已经迅速成为大家购买耳机的新趋势,深受喜欢听歌和热爱运动的人群欢迎。当大家谈到佩戴的稳固性时,开放式耳机都会收到一致好评。对于热爱运动的人士而言,高品质的开放式耳机无疑是理想之选。特别是在近年来的一些骑…

代理ip注册网站都通不过网站建设返回函数

Scala 集合 概述 集合本质上就是一个用于存储1个到多个数据的容器。在Scala中,集合可以分为三大类:Seq(序列),Set(集合)和Map(映射)。基于这三大类,衍生出来众多的子类 序列:元素有序可重复 集合:元素无…

兰溪城市建设规划网站大有网网站

提示说没有.git这样一个目录 在命令行 输入 git init 然后回车就好了 git remote add origin https:/.git git push -u origin "master"

怎样制作自己网站模板手机网站建设

本文以MATLAB自带的脂肪数据集为例,将数据保存在EXCEL工作簿内,方便替换数据使用,以下介绍粒子群算法优化BP神经网络预测的MATLAB代码编写,主要流程包括1. 读取数据 2.划分训练集和测试集 3.归一化 4.确定BP神经网络的隐含层最优节点数量 5. 使用粒子群算法优化BP的神经网络…

建设信用卡网站换积分高中信息技术课程做网站

1.路劲处理模块 path 1.1 模块概览 在nodejs中,path是个使用频率很高,但却让人又爱又恨的模块。部分因为文档说的不够清晰,部分因为接口的平台差异性。将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了。 1.…

云南省建设工程投标中心网站瑞安app开发

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》 文章目录 前言一、栈的实现思路1. 结构的定义2. 初始化栈(StackInit)3. 入栈(StackPush)4. 出栈(StackPop)5. 获取栈顶元素(StackTop)6. 检查栈是否为空(StackEmpty)7. 销毁栈(StackDestroy) 二、…

青岛品牌网站制作旅游网站总结

0.实现效果 效果不咋好 ,参数不好调整 1.算法原理 3D NDT(Normal Distributions Transform)算法是一种用于同时定位和地图生成(SLAM)的机器人导航算法,特别适用于三维点云数据的配准。以下是关于3D NDT算法的详细解释: 算法原理 点云划分与分布计算:3D NDT算法首先将…

凡科建站seo那个网站教人做冰点

原型&#xff1a;extern char *strstr(const char *str1, const char *str2); 需要包含的头文件&#xff1a;#include <string.h> 作用&#xff1a;用于判断字符串str2在字符串str1中第一次出现的位置。如果没有找到则返回NULL&#xff0c;找到了则返回str1中的位置。 …

seo网站推广经理公司主营业务网站建设

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…

西安网站优化服务西安建设工程信息网新平台

2.2.2 if 案例实践 学习目标 这一节&#xff0c;我们从 服务管理、堡垒机登录、小结 三个方面来学习。 服务管理 案例需求 要求脚本执行需要有参数&#xff0c;通过传入参数来实现不同的功能。参数和功能详情如下&#xff1a;参数 执行效果start 服务启动中...sto…

西安网站设计外包公司瑞安网站建设电话

标准类型内建函数&#xff1a;cmp(obj1, obj2) 比较obj1和obj2&#xff0c;根据比较结果返回整型i:i < 0 if obj1 < obj2i > 0 if obj1 > obj2i 0 if obj1 obj2repr(obj)或obj 返回一个对象的字符串表示str(obj) 返回对象适合可读性好的字符串表示type(obj) 得到…

# vite + vue3 实现打包后 dist 文件夹可以直接打开 html 文件预览

vite + vue3 实现打包后 dist 文件夹可以直接打开 html 文件预览 问题 为什么突然写这么一篇文章,首先,自己用vite+vue写了点静态页面,需要给客户看页面效果,但是我打包之后将 dist 发送给客户后,客户没有通过ngi…

Python 在人工智能与机器学习中的地位与实践

一、引言 🤖 人工智能(AI)和机器学习(ML)是当下科技发展的核心动力。从语音识别到图像分类,从推荐系统到自然语言处理,AI 正在不断改变人类的生产和生活方式。而在这一浪潮中,Python 已成为最主要的开发语言。…

怎样做彩票投资网站国外刺绣图案设计网站

一、介绍 Portainer是Docker的图形化管理工具&#xff0c;提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作&#xff08;包括上传下载镜像&#xff0c;创建容器等操作&#xff09;、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用…

订阅号怎么做微网站无忧网站模板

teger 基本数据类型int 的包装类 Integer 类型的对象包含一个 int 类型的字段 一、类定义 public final class Integer extends Number implements Comparable<Integer>{}类被声明为final的,表示不能被继承;继承了Number抽象类,可以用于数字类型的一系列转换;实现了Comp…

做塑料的网站名字万户建站

使用 Redis 可以优化性能&#xff0c;但是存在 Redis 的数据和数据库同步的问题&#xff0c;这是我们需要关注的问题。假设两个业务逻辑都是在操作数据库的同一条记录&#xff0c;而 Redis 和数据库不一致。 Redis 和数据库不一致 在图中&#xff0c;T1 时刻以键 key1 保存数…

seo三人行网站百度安装app下载免费

螺旋式开发并不是敏捷开发。虽然它们都是软件开发过程中的一种模型或方法&#xff0c;但两者在核心理念、实施方式和适用场景上存在显著差异。 螺旋式开发是一种结合了瀑布式开发和迭代式开发的软件开发过程。它强调风险分析和质量保证&#xff0c;在每个螺旋周期中都包括需求…

深圳骏域网站建设专家有一个做场景动画的网站

出现这个问题不是一次两次了&#xff0c;就是启动后&#xff0c;键盘所有按键&#xff0c;小红帽都不能用&#xff0c;必须重启好几次才能用。 有时候键盘能用&#xff0c;但是打开 dw ,复制不能用&#xff0c;真是懊恼。 今天又出现这个情况&#xff0c;我偶然想到是不是和昨天…