当前位置: 首页 > news >正文

Android布局层级过深为什么会对性能有影响?为什么Compose没有布局嵌套问题?

做过布局性能优化的同学都知道,为了优化界面加载速度,要尽可能的减少布局的层级。这主要是因为布局层级的增加,可能会导致测量时间呈指数级增长。

而Compose却没有这个问题,它从根本上解决了布局层级对布局性能的影响: Compose界面只允许一次测量。这意味着随着布局层级的加深,测量时间也只是线性增长的.

下面我们就一起来看看Compose到底是怎么只测量一次就把活给干了的,本文主要包括以下内容:

  • 布局层级过深为什么影响性能?
  • Compose为什么没有布局嵌套问题?

①布局层级过深为什么影响性能?

我们总说布局层级过深会影响性能,那么到底是怎么影响的呢?主要是因为在某些情况下ViewGroup会对子View进行多次测量

举个例子

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="match_parent"android:orientation="vertical"><Viewandroid:layout_width="match_parent"android:layout_height="100dp"android:background="@android:color/holo_red_dark" /><Viewandroid:layout_width="100dp"android:layout_height="100dp"android:background="@android:color/black" />
</LinearLayout>
  • LinearLayout宽度为wrap_content,因此它将选择子View的最大宽度为其最后的宽度
  • 但是有个子View的宽度为match_parent,意思它将以LinearLayout的宽度为宽度,这就陷入死循环了
  • 因此这时候, LinearLayout 就会先以0为强制宽度测量一下子View,并正常地测量剩下的其他子View,然后再用其他子View里最宽的那个的宽度,二次测量这个match_parent的子 View,最终得出它的尺寸,并把这个宽度作为自己最终的宽度。
  • 这是对单个子View的二次测量,如果有多个子View写了match_parent ,那就需要对它们每一个都进行二次测量。
  • 除此之外,如果在LinearLayout中使用了weight会导致测量3次甚至更多,重复测量在Android中是很常见的

上面介绍了为什么会出现重复测量,那么会有什么影响呢?不过是多测量了几次,会对性能有什么大的影响吗?

之所以需要避免布局层级过深是因为它对性能的影响是指数级的

  • 如果我们的布局有两层,其中父View会对每个子View做二次测量,那它的每个子View一共需要被测量 2 次

  • 如果增加到三层,并且每个父View依然都做二次测量,这时候最下面的子View被测量的次数就直接翻倍了,变成 4 次

  • 同理,增加到 4 层的话会再次翻倍,子 View 需要被测量 8 次

也就是说,对于会做二次测量的系统,层级加深对测量时间的影响是指数级的,这就是Android官方文档建议我们减少布局层级的原因

②Compose为什么没有布局嵌套问题?

我们知道,Compose只允许测量一次,不允许重复测量。

如果每个父组件对每个子组件只测量一次,那就直接意味着界面中的每个组件只会被测量一次

这样即使布局层级加深,测量时间却没有增加,把组件加载的时间复杂度从O(2ⁿ) 降到了 O(n)。

那么问题就来了,上面我们已经知道,多次测量有时是必要的,但是为什么Compose不需要呢?

Compose中引入了固有特性测量(Intrinsic Measurement)

固有特性测量即Compose允许父组件在对子组件进行测量之前,先测量一下子组件的「固有尺寸」

我们上面说的,ViewGroup的二次测量,也是先进行这种「粗略测量」再进行最终的「正式测量」,使用固有特性测量可以产生同样的效果

而使用固有特性测量之所以有性能优势,主要是因为其不会随着层级的加深而加倍,固有特性测量也只进行一次

Compose会先对整个组件树进行一次Intrinsic测量,然后再对整体进行正式的测量。这样开辟两个平行的测量过程,就可以避免因为层级增加而对同一个子组件反复测量所导致的测量时间的不断加倍了。

总结成一句话就是,在Compose里疯狂嵌套地写界面,和把所有组件全都写进同一层里面,性能是一样的!所以Compose没有布局嵌套问题

Android 学习笔录

Kotlin 篇:https://qr18.cn/CdjtAF
Android 性能优化篇:https://qr18.cn/FVlo89
Android 车载篇:https://qr18.cn/F05ZCM
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
Gradle 篇:https://qr18.cn/DzrmMB
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 面试题锦:https://qr18.cn/CKV8OZ

相关文章:

Android布局层级过深为什么会对性能有影响?为什么Compose没有布局嵌套问题?

做过布局性能优化的同学都知道&#xff0c;为了优化界面加载速度&#xff0c;要尽可能的减少布局的层级。这主要是因为布局层级的增加&#xff0c;可能会导致测量时间呈指数级增长。 而Compose却没有这个问题&#xff0c;它从根本上解决了布局层级对布局性能的影响: Compose界…...

【UR机械臂CB3 网络课程 】

【UR机械臂CB3 网络课程 】1. 前言2. 概览:特色与术语2.1 机器人组成2.1.1控制柜2.1.2 UR 机器人手臂2.2 接通机器人电源2.3 移动机械臂3. 机器人如何工作3.1 选择臂端工具3.2 输入有关臂端工具的信息3.3 连接外部装置3.4 机器人编程4. 设置工具4.1 末端执行器配置4.2 工具中心…...

dp-统计字典序元音字符串的数目

给你一个整数 n&#xff0c;请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。 字符串 s 按 字典序排列 需要满足&#xff1a;对于所有有效的 i&#xff0c;s[i] 在字母表中的位置总是与 s[i1] 相同或在 s[i1] 之前。 示例 1&#xff1a; 输入&…...

LFM雷达实现及USRP验证【章节3:连续雷达测距测速】

第一章介绍了在相对速度为0时候的雷达测距原理 目录 1. LFM测速 1.1 雷达测速原理 1.2 Chrip信号测速 2. LFM测速代码实现 参数设置 仿真图像 matlab源码 代码分析 第一章介绍了在相对速度为0时候的雷达测距原理&#xff0c;第二章介绍了基于LFM的雷达测距原理及其实现…...

COLMAP多视角视图数据可视化

这篇博文主要介绍多视角三维重建的实用工具COLMAP。为了让读者更快确定此文是否为自己想找的内容&#xff0c;我先用简单几句话来描述此文做的事情&#xff1a; 假设我们针对一个物体&#xff08;人&#xff09;采集了多个&#xff08;假设60个&#xff09;视角的照片&#xff…...

2023年全国最新高校辅导员精选真题及答案36

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 92.校园文化形成与发展的主要影响因素有&#xff08;&#xff09; A.学校的领导与管理活…...

ThreeJS-全屏和退出全屏、自适应大小(五)

下载新得组件 npm install gsap -S 新引入 import gsap from gsap //动画控制 代码&#xff1a; <template> <div id"three_div"> </div> </template> <script> import * as THREE from "three"; import {OrbitControls } f…...

等级保护2.0要求及所需设备清单

等级保护的工作流程包括定级、备案、建设整改、等级测评&#xff0c;核心思想在于建立“可信、可控、可管”的安全防护体系&#xff0c;使得系统能够按照预期运行&#xff0c;免受信息安全攻击和破坏。 三级等保要求及所需设备 三级等级保护指标项&#xff1a; 物理访问控制…...

【大数据之Hadoop】六、HDFS之NameNode、Secondary NameNode和DataNode的内部工作原理

NN和2NN的内部工作原理 对于NameNode的存放位置&#xff1a; 内存中&#xff1a;好处&#xff1a;计算快 坏处&#xff1a;可靠性差&#xff0c;断电后元数据会丢失 磁盘中&#xff1a;好处&#xff1a;可靠性搞 坏处&#xff1a;计算慢 内存磁盘中&#xff1a;效率低 所以设…...

小黑子—Java从入门到入土过程:第四章

Java零基础入门4.0Java系列第四章1. 顺序结构2. if语句3. switch 语句3.1 default的位置和省略3.2 case 穿透3.3 switch 新特性 &#xff08;jdk12开始&#xff09;4. for 循环5. while 循环6.do...while 循环7. 无限循环8. 跳转控制语句9. 练习9.1 逢七过9.2 平方根9.3 求质数…...

数据库原理及应用(四)——SQL语句(2)SQL基础查询以及常见运算符

一、SELECT语句基础 数据库查询是数据库的核心操作&#xff0c;SELECT 语句用于从数据库中选取数据。 SELECT [ALL/DISTINCT] <列名>,<列名>...FROM <表名或视图名>,<表名或视图名>[WHERE <条件表达式>][GROUP BY <列名1> [HAVING <条…...

(算法基础)Floyd算法

适用情景Floyd算法适用于多源汇最短路&#xff0c;也就是他问你比如说从3号点到6号点的最短路距离&#xff0c;比如说从7号点到20号点的最短路距离&#xff0c;而不是单源最短路&#xff08;从1号点到n号点的最短路距离&#xff09;。在这个算法当中允许负权边的存在。但在求最…...

SQL语法:浅析select之七大子句

Mysql版本&#xff1a;8.0.26 可视化客户端&#xff1a;sql yog 目录一、七大子句顺序二、演示2.1 from语句2.2 on子句2.3 where子句2.4 group by子句2.4.1 WITHROLLUP&#xff0c;加在group by后面2.4.2 是否可以按照多个字段分组统计&#xff1f;2.4.3 分组统计时&#xff0c…...

中国人民大学与加拿大女王大学金融硕士——去有光的地方,并成为自己的光

光是我们日常生活中一个重要的元素&#xff0c;试想一下如果没有光&#xff0c;世界将陷入一片昏暗。人生路亦是如此&#xff0c;我们从追逐光、靠近光、直到自己成为光。人民大学与加拿大女王大学金融硕士项目是你人生路上的一束光吗 渴望想要成为一个更好的人&#xff0c;就…...

Python数据结构与算法篇(五)-- 二分查找与二分答案

1 二分法介绍 1.1 定义 二分查找又称折半查找、二分搜索、折半搜索等&#xff0c;是一种在静态查找表中查找特定元素的算法。 所谓静态查找表&#xff0c;即只能对表内的元素做查找和读取操作&#xff0c;不允许插入或删除元素。 使用二分查找算法&#xff0c;必须保证查找表中…...

小游戏也要讲信用

当下&#xff0c;小游戏鱼龙混杂&#xff0c;官方为能更好地保护用户、开发者以及平台的权益&#xff0c;近日宣布7月1日起试行小游戏主体信用分机制。 主体信用分是什么呢&#xff1f;简单来说&#xff0c;这是针对小游戏主体下所有小游戏帐号行为&#xff0c;对开发者进行评…...

贪心算法11

1. 贪心算法的概念 所谓贪心算法是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架&#xff0c;算法设计的关键是贪心…...

【并发编程】JUC并发编程(彻底搞懂JUC)

文章目录一、背景二、什么是JUC&#xff1f;三、JUC框架结构四、JUC框架概述五、JUC中常用类汇总六、相关名词进程和线程进程线程创建线程的几种常见的方式并发和并行用户线程和守护线程七、synchronized 作用范围&#xff1a;八、Lock锁(重点)什么是 Lock锁类型Lock接口lock()…...

Compose 动画 (七) : 高可定制性的动画 Animatable

1. Animatable和animateDpAsState的区别是什么 Animatable是Android Compose动画的底层API&#xff0c;如果我们查看源码&#xff0c;可以发现animateDpAsState内部是调用的animateValueAsState&#xff0c;而animateValueAsState内部调用的是Animatable animateDpAsState比A…...

vue3组件传值

1.父向子传值 父组件 引入子组件 import Son from ./components/Son.vue 设置响应式数据 const num ref(99) 绑定到子组件 <Son :num"num"></Son> 子组件 引入defineProps import { defineProps } from vue; 生成实例接收数据 type设置接收类…...

小白开发微信小程序00--文章目录

一个小白&#xff0c;一个老牛&#xff0c;空手能不能套白羊&#xff0c;能不能白嫖&#xff1f;我告诉你&#xff0c;一切都so easy&#xff0c;这个系列从0到106&#xff0c;屌到上天&#xff0c;盖过任何一个&#xff0c;试问&#xff0c;网上讲微信小程序开发的&#xff0c…...

随手记录第九话 -- Java框架整合篇

框架莫过于Spring了&#xff0c;那就以它为起点吧。 本文只为整理复习用&#xff0c;详细内容自行翻看以前文章。 1.Spring 有人说是Spring成就Java&#xff0c;其实也不是并无道理。 1.1 Spring之IOC控制反转 以XML注入bean的方式为入口&#xff0c;定位、加载、注册&…...

电影《铃芽之旅》观后感

这周看了电影《铃芽之旅》&#xff0c;整部电影是新海诚的新作。电影讲述的是女主铃芽为了关闭往门&#xff0c;在日本旅行中&#xff0c;遭遇灾难的故事。 &#xff08;1&#xff09;往昔记忆-往昔之物 电影中&#xff0c;有很多的“往门”&#xff0c;换成中国的话说&#xf…...

Web自动化测试(二)(全网最给力自动化教程)

欢迎您来阅读和练手&#xff01;您将会从本章的详细讲解中&#xff0c;获取很大的收获&#xff01;开始学习吧&#xff01; 2.4 CSS定位2.5 SeleniumBuilder辅助定位元素2.6 操作元素&#xff08;键盘和鼠标事件&#xff09; 正文 2.4 CSS定位 前言 大部分人在使用selenium定…...

【C语言经典例题!】逆序字符串

目录 一、题目要求 二、解题步骤 ①递归解法 思路 完整代码 ②循环解法 思路 完整代码 嗨大家好&#xff01; 本篇博客中的这道例题&#xff0c;是我自己在一次考试中写错的一道题 这篇博客包含了这道题的几种解法&#xff0c;以及一些我自己对这道题的看法&#xff…...

21 - 二叉树(三)

文章目录1. 二叉树的镜像2. 判断是不是完全二叉树3. 完全二叉树的节点个数4. 判断是不是平衡二叉树1. 二叉树的镜像 #include <ctime> class Solution {public:TreeNode* Mirror(TreeNode* pRoot) {// write code hereif (pRoot nullptr) return pRoot;//这里记得要记得…...

【A-Star算法】【学习笔记】【附GitHub一个示例代码】

文章目录一、算法简介二、应用场景三、示例代码Reference本文暂学习四方向搜索&#xff0c;一、算法简介 一个比较经典的路径规划的算法 相关路径搜索算法&#xff1a; 广度优先遍历&#xff08;BFC&#xff09;深度优先遍历&#xff08;DFC&#xff09;Di jkstra算法&#…...

纽扣电池澳大利亚认证的更新要求

澳大利亚强制性安全和信息标准草案具体规定了对含有纽扣电池和纽扣电池以 及纽扣电池和纽扣电池本身的消费品的要求&#xff0c; 适用范围 1.本法规适用于: 纽扣锂电池(任何尺寸和类型); 直径为16毫米或以上的纽扣锂电池: 一起提供的纽扣电池(未预先安装在产品中)。 2.但是&…...

零代码零距离,明道云开放日北京站圆满结束

文/麦壁瑜 编辑/李雨珂 2023年3月17日&#xff0c;为期一天的明道云开放日北京站圆满结束。本次开放日迎来超过100名伙伴和客户现场参会&#xff0c;其中不乏安利、通用技术集团、民生银行、迈外迪、DELSK集团、中国人民养老保险、北京汽车等知名企业代表。北京大兴机场、作业…...

第五章Vue路由

文章目录相关理解vue-router的理解对SPA应用的理解路由的理解基本路由几个注意点嵌套路由——多级路由路由query参数命名路由路由的params参数路由的props配置路由跳转的replace方法编程式路由导航缓存路由组件路由组件独有的生命钩子activated和deactivated路由守卫全局路由守…...

wordpress 4.9中文版/手机优化

【问题描述】 STL next_permutation() 函数&#xff0c;常用于输出给定序列的全排列。但由于对STL next_permutation() 函数的返回值不明晰&#xff0c;导致一些朋友在解读使用STL next_permutation() 函数的代码时&#xff0c;存在困惑。例如&#xff0c;下方代码一、代码二的…...

建个购物网站/苹果cms永久免费建站程序

这次先进行简单的爬取&#xff0c;获取一定数量的电影url、id等信息。为下次项目做铺垫 &#xff08;请大家在爬取信息时控制循环的次数&#xff01;&#xff01;&#xff01;&#xff09; 代理ip的设置&#xff0c;请看&#xff1a;https://blog.csdn.net/az9996/article/det…...

电脑系统重装后没有wordpress/网络营销的优势是什么

一、传统框架介绍 1&#xff09;Hibernate 是一种ORM框架&#xff0c;在Java对象与关系型数据库之间建立某种映射&#xff0c;以实现直接存取Java对象&#xff08;POJO&#xff09;。 2&#xff09;ORM框架是一种不同与MVC的另一种思想框架&#xff0c;适用范围也与MVC截然不同…...

电商专业是做什么的/搜狗seo排名软件

目录前言Oracle 内存结构Oracle 进程结构文章总结前言上一篇文章体现了 Oracle 数据库的一些基本结构和存储结构&#xff0c;这篇文章将会讲到Oracle的服务器结构&#xff0c;实际上就是主要讲实例的结构。需要把这些底层的结构了解&#xff0c;在生产环境或是对Oracle才会有一…...

哪个博客可以做单页网站/百度收录网站需要多久

///自己copy过来的&#xff0c;忘了出处&#xff0c;一来分享&#xff0c;二来保存起来 CREATEPROCP_TEST NameVARCHAR(20), RowcountINTOUTPUT ASBEGINSELECT*FROMT_Customer WHERENAMENameSETRowcountROWCOUNTENDGO--存储过程调用如下: -----------------------------------…...

海口房产网/365优化大师软件下载

下载脱机安装程序|源包脱机安装程序|断续器 (qt.io)https://www.qt.io/offline-installers 一&#xff0e;Qt的下载 由于Qt 自从5.15版本开始&#xff0c;对非商业版本&#xff08;也就是开源版本&#xff09;&#xff0c;不提供已经制作好的离线exe安装包。所以&#xff0c;…...