Android 为什么设计只有主线程更新UI?

news2024/11/24 6:48:56

选择方案的选择

  1. 单线程更新UI
  2. 多线程更新UI

从问题本身考虑就两个方案不是单线程就是多线程。

下面是个人根据具体情况分析,如果有什么不对的地方,欢迎指正。

从开发效率来看,开发一个 单线程UI 库,会显得非常容易,而且,每个控件的运行效率肯定会比多线程的效率高,比如我们单线程可以使用HashMap,多线程就需要使用JUC 框架下的类库了,这个效率肯定比 HashMap低很多,这样就很好理解。编写一个多线程的UI库,很可能每个控件,都会加锁,控件本身效率就低了,但是这样还不够 ,后面会解释。

还有一个简单方案,就是对真个UI库,加锁,而不是具体某个控件,就是确保同一时刻,只能有一个线程,对整个UI系统更新,这个已经有点单线程更新UI的意思了 。但是锁的粒度会很大,如果一个页面100个控件,相当于每个控件都加锁了。

这个方案实现起来倒是不复杂,只需要设计一个boolean变量就可以,任何线程需要更新UI 都会访问这个变量获取锁,这个方案会造成所有的线程都竞争同一把锁,单从运行效率分析,应该是很高的,但是这个竞争特别激烈,可能造成的问题就是,事件响应不够及时,

单线程更新UI方案简单成熟

单线程更新UI方案,从上面的分析来看,优势就很明显,整体设计可能是最简单的,每个控件的设计只需要考虑单线程运行就可以,完全不必关系其他线程更新UI。

而且这套方案非常成熟,在Android 之前,swing qt windows 几乎绝大部分图形界面api 都会使用这个单线程方案。

从执行效率看

前面说了,如果一个加锁的api 和不加锁的api 比较,那肯定不加锁效率高对吧,但是,这么说确实很笼统,如果合理设计一套多线程更新ui 的库,整体性能未必会比单线程差,只是想实现这样一套系统的复杂程度,可能不只是翻倍那么简单,设计越复杂,带来的问题是 潜在bug 可能会多,但是这些,在设计ui系统 的时候未必是这样考虑的,如果业务复杂,效果会更好,那么我相信大部分企业还是会设计一个复杂的系统的。

综合考虑?

多线程更新UI,不管如何设计都会绕不开一个问题,就是竞争,而这个竞争,是整个UI系统的,而不是单独一个控件,大部分情况下,一个线程可能同时更新的是过个控件,而要确保我一次更新的所有控件是同步更新的,所以要保证这个逻辑,其实我们就要确保一个问题,同一时刻。永远只允许一个线程去更新UI。不能保证这一点,就会造成业务逻辑可能各种问题,甚至各种死锁。

既然同一个时刻只能一个线程更新,那设计成单线程是不是就更好呢,到这里,其实还是不够全面的,还有个因素就是事件相应。如果多线程更新的情况下,其实这个是不容易实现的, 反而单线程,就好实现一些。

总结

通过分析总结几个点。

1.一般UI还是要保证同一时刻只有一个线程在更新,所以效率不会更高。
2.多线程更新UI实现上会复杂一些,Java的内部人员发布过文章也说过这个几乎不可实现。
3.从响应速度角度分析,单线程可以设计出更好的响应速度的api
4.单线程更新,也是一个被证明效果非常好的方案。

从过个角度分析 Android 为什么设计只有主线程更新UI 都是最好的选择。

不过回答这个问题需要理解的不全是结论,而是对这个问题,和图形界面开发的理解。

如果说效率高,安全,也需要回答出来为什么。这些不是凭空说的。真的效率高吗?高在哪里?都需要说清楚,可能会有不正确的地方。但是只要把需要考虑的点表达清晰就好

引用
负责Swing开发的一个大师的一篇博客《Multithreaded toolkits: A failed dream?》

也有人说单新ui 效率会高,因为多线程会加锁。如果有人能把这个细节解释清楚呢,希望留言。因为正常设计也只是锁更新那一行代码而已,我的总结就是效率不分伯仲,希望大家探讨吧。

下面是我在学习中整理的一些学习资料,大家如不嫌弃可以点击【Android 八大知识体+2023年Android最新面试题】地址查看获取

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

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

相关文章

动态gif图片如何快速制作?分享一招快速制作gif动画

动态gif图片对大家来说都不陌生了,常常会在各种社交平台中见到,那么,这种gif动图片要怎么制作呢?很简单,给大家分享一款专业的gif制作(https://www.gif.cn/)工具-GIF中文网,只需要上…

【多维BFS】AB路线

P2038 - AB 路线 - ZJHUOJ 题意: 思路: 首先看是什么影响了决策,即能不能走这个格子 走到当前格子是第几步和格子的字符种类影响了能不能走该格子,因此需要多加一维k,表示走到当前字符种类的第k步 然后就可以去BFS…

Jvm对象创建-JVM(六)

上篇文章说了jvisualvm工具查看年轻代老年代gc过程。 Jvisualvm&内存模型剖析-JVM(五)https://blog.csdn.net/ke1ying/article/details/131524708 jvm创建对象 之前我们介绍了类的加载,这篇文章要介绍类的创建,过程主要是&a…

通俗易懂生成对抗网络GAN原理(二)

生成对抗网络(Generative Adversarial Network, GAN)的原理 学习李宏毅机器学习课程总结。 前面学习了GAN的直观的介绍,现在学习GAN的基本理论。现在我们来学习GAN背后的理论。 引言 假设x是一张图片(一个高维向量)…

「AntV」使用AntV X6实现流程编排设计器

通过对BPMN的深入学习,以及对业界成熟的流程编排设计器的调研,了解到要研发一个流程编排设计器,需要实现如下几个主要的功能: 支持创建各种流程图元素,包括任务(活动)、网关、事件等。支持绘制…

漏洞复现 || NginxWebUI 后台命令执行runCmd远程命令执行

免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此…

【Linux】yum git 的使用

yum 的使用 yum 源的查看 yum 源就是一个配置文件。 可以看到 yum 源的文件中包含有很多下载源的链接。我们使用 yum 命令进行安装的时候,就是通过这些链接去寻找下载源进行下载的。这些链接一般都是国内的镜像网址。 所谓的更新 yum 源,也就是将最新…

异步交互技术Ajax

Ajax 概念:Asynchronous JavaScr And XML 异步的JavaScript和XML作用: 数据交换:通过Ajax可以给服务器发送请求,并获取服务响应的数据异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部…

mysqldump + python 定时备份数据库

场景: 需要对mysql进行定时备份,受限于硬盘空间的大小,需要对备份的数据需要定时清理 python代码实现: # -*- coding:UTF-8 -*- """ProjectName : HotelGo2DelonixPmxFileName : fix_missing_ratesDescripti…

第二章:L2JMobius学习 – 安装jdk17

L2JMobius是一套开源的 LineageII 的服务器端代码,使用Java语言编写。想要运行L2JMobius源程序的话,需要安装jdk17版本。首先,下载jdk17版本。 https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.msi 当然,也…

华为OD机试真题 Java 实现【新员工座位安排系统】【2022Q4 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 工位由序列F1,F2…Fn组成,Fi值为0、1或2。其中0代表空置,1代表有人,2代表障碍物。 1、某一空位的友好度为左右连续…

ModaHub魔搭社区:腾讯云发布的向量数据库有什么特点?技术架构是什么样的?

腾讯云发布的向量数据库有什么特点?技术架构是什么样的? Tencent Cloud VectorDB从性能上看,具备高性能、高可用、低成本等优势,比如单索引支持10亿级向量规模,最快支持毫秒级数据实时更新,适用于AI运算、…

【STM32】自举模式 和 程序下载(ST-Link和串口示例)

STM32官方网站STM32中文社区 如果遇到不清楚的概念,可以看之前的文章。 一、自举模式二、程序下载2.1 概述2.2 实操2.21 SWD 方式下载(ST-Link)2.22 串口下载 一、自举模式 STM32有一个特殊的功能,就是可以通过不同的方式启动程序…

maven 工程结构 和 archetype 模板

文章目录 一、maven 工程结构1.1. jar 工程结构1.2. war 工程结构 二、archetype 模板2.1. 推荐的 archetype 模板2.2. 自定义 archetype 模板2.2.1 自定义模板示例 有没有好奇过,通过 Maven 生命周期命令构建项目时,我们并没有指定源文件目录和编译后的…

5张图告诉你:同样是职场人,差距怎么这么大?

点赞 ➕ 评论 ➕ 收藏 养成三连好习惯 在职场中,我们常常会听到各种各样的抱怨: 👩‍⚖️‍ 小A: 凭什么别人每次述职绩效都是优秀呀? 感觉TA也没干啥呀! 🕵 小B: 凭啥这个事情,领导指派TA去对接呀&#…

“设计模式”概述

设计模式代码样例:Git 设计原则 依赖倒置原则(DIP) 高层模块(稳定)不应依赖底层模块(变化),二者都应依赖于抽象(稳定)抽象不应依赖于实现细节,…

YoloV5/YoloV7改进---注意力机制:线性上下文变换LCT,性能优于SE

目录 1.LCT介绍 2.LCT引入到yolov5 2.1 加入common.py中: 2.2 加入yolo.py中: 2.3 yolov5s_LCT.yaml 2.4 yolov5s_LCT1.yaml 3.YOLOv5/YOLOv7魔术师专栏介绍 1.LCT介绍 论文: https://arxiv.org/pdf/1909.03834v2.pdf AAAI 2020 摘要&a…

最长上升子序列 (从dp---->贪心)

最长上升子序列 思路: 题目要求找到最长上升的子序列,那么这个时候,我们可以假以第i个为结尾,那么此时以i为结尾的最大上升子序列是多少。但是这个时候,会发现,从第i个为结尾往前面找的话,是一…

20230705点亮STC32G实验箱9.6(STC32G12K128)开发板的跑马灯LED(深入了解)

08第六集:LED闪烁第六集:LED闪烁和花式点灯上和花式点灯上.mp4 09第六集:LED闪烁和花式点灯下.mp4 【大文哥学习32位8051】20230704【冲哥视频】第六集的晶振时钟的学习困惑 2023/7/5 17:36 delay_ms(3000); 刷机的时候如果使用11.0592M的Fos…

Ardupilot学习笔记

参考文献 【1】https://ardupilot.org 主打的就是一个炫酷 自驾仪 Ardupilot 一套开源的自驾仪,集成了各种各样的代码,包括其他开源代码(如PX4代码)和项目、驱动等。 即:自驾仪即集成了整个可以实现无人载具(如无人机&#xff…