[Java、Android面试]_24_Compose为什么绘制要比XML快?(高频问答)

devtools/2024/9/23 2:32:35/
xmlns="http://www.w3.org/2000/svg" style="display: none;">

欢迎查看合集:
Java、Android面试高频系列文章合集

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。
整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可关注+收藏

文章目录

    • 1. XML结构
    • 2. Compose

1. XML结构

XML布局文件的界面层级要尽量地少,越少越好,因为层级的增加会大幅拖慢界面的加载。这种拖慢的主要原因就在于各种 Layout 的重复测量。虽然重复测量对于布局过程是必不可少的,但这也确实让界面层级的数量对加载时间的影响变成了指数级。

1.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
2.    android:layout_width="wrap_content"  
3.    android:layout_height="wrap_content"  
4.    android:orientation="vertical">  
5.    <View  
6.        android:layout_width="match_parent"  
7.        android:layout_height="48dp" />  
8.    <View  
9.        android:layout_width="120dp"  
10.        android:layout_height="48dp" />  
11.    <View  
12.        android:layout_width="160dp"  
13.        android:layout_height="48dp" />  
14.</LinearLayout>  

如上代码:LinearLayout的宽度是“wrap_content”,而子布局有个“match_parent”!这时候, LinearLayout 就会先以 0 为强制宽度测量一下这个子 View,并正常地测量剩下的其他子 View,然后再用其他子 View 里最宽的那个的宽度,二次测量这个match_parent 的子 View,最终得出它的尺寸,并把这个宽度作为自己最终的宽度。这时就对子View造成了二次测量。

这是对单个子 View 的二次测量,如果有多个子 View 写了 match_parent ,那就需要对它们每一个都进行二次测量。

重复测量是 ViewGroup 实现正确测量所必需的手段,但同时也让我们需要非常注意尽量减少布局的层级。为什么呢?来看一个最简单的例子,如果我们的布局有两层,其中父 View 会对每个子 View 做二次测量,那它的每个子 View 一共需要被测量 2 次。

如果增加到三层,并且每个父 View 依然都做二次测量,这时候最下面的子 View 被测量的次数就直接翻倍了,变成 4 次。如下图所示:
在这里插入图片描述
当然了,现实中并不是每个父 View 都会进行二次测量,以及有些父 View 会对子 View 做三次或者更多次的测量,所以这只是一个粗略估计,不过——大致就是这个数量级了。

而 O(2ⁿ) 这种指数型的时间复杂度,说白了就是,View 的层级每增加 1,加载时间就会翻一倍

2. Compose

Compose 禁用了二次测量,但加入了一个新东西:Intrinsic Measurement,官方把它翻译做「固有特性测量」。
在这里插入图片描述

所谓的 Intrinsic Measurement,指的是 Compose 允许父组件在对子组件进行测量之前,先测量一下子组件的「固有尺寸」,直白地说就是「你内部内容的最大或者最小尺寸是多少」。这是一种粗略的测量,虽说没有真正的「二次测量」模式那么自由,但功能并不弱,因为各种 Layout 里的重复测量,其实本来就是先进行这种「粗略测量」再进行最终的「正式测量」的——比如刚才说的那种「外面 wrap_content 里面 match_parent」的,对吧?想想是不是?这种「粗略」的测量是很轻的,并不是因为它量得快,而是因为它在机制上不会像传统的二次测量那样,让组件的测量时间随着层级的加深而不断加倍。

当界面需要这种 Intrinsic Measurement——也就是说那个所谓的「固有特性测量」——的时候,Compose 会先对整个组件树进行一次 Intrinsic 测量,然后再对整体进行正式的测量。这样开辟两个平行的测量过程,就可以避免因为层级增加而对同一个子组件反复测量所导致的测量时间的不断加倍了。

此时的时间复杂度为O(2n)=O(n),所以更快!


http://www.ppmy.cn/devtools/27370.html

相关文章

C# 实现格式化文本导入到Excel

目录 需求 Excel 的文本文件导入功能 范例运行环境 配置Office DCOM 实现 组件库引入 OpenTextToExcelFile 代码 调用 小结 需求 在一些导入功能里&#xff0c;甲方经常会给我们一些格式化的文本&#xff0c;类似 CSV 那样的纯文本。比如有关质量监督的标准文件&…

数据结构四:线性表之带头结点的单向循环链表的设计

前面两篇介绍了线性表的顺序和链式存储结构&#xff0c;其中链式存储结构为单向链表&#xff08;即一个方向的有限长度、不循环的链表&#xff09;&#xff0c;对于单链表&#xff0c;由于每个节点只存储了向后的结点的地址&#xff0c;到了尾巴结点就停止了向后链的操作。也就…

乾元通渠道商中标天津某区自然灾害应急能力提升项目

近日&#xff0c;乾元通渠道商中标天津某区自然灾害应急能力提升项目&#xff0c;乾元通作为设备厂家&#xff0c;为项目提供通信指挥类装备&#xff08;多链路聚合设备&#xff09; QYT-X1 。 随着万亿国债项目的全面铺开&#xff0c; 青岛乾元通数码科技有限公司 作为国家应急…

【汇编】指令系统的寻址方式

指令系统的寻址方式 指令系统的寻址方式是指计算机处理器在执行指令时&#xff0c;如何定位并访问指令中操作数所在的内存地址或寄存器&#xff08;寻址方式&#xff1a;获取操作数所在地址的方法&#xff09; 指令中的操作数 通常一条指令包含操作符和操作数&#xff0c;操…

QSqlTableModel的canFetchMore、fetchMore效率太低,需替换

问题描述&#xff1a;SQLITE数据库&#xff0c;使用QSqlTableModel获取行数&#xff0c;调用函数rowCount()&#xff0c;仅能获取256行&#xff0c;故使用下面代码获取实际行数&#xff1a; while(m_model->canFetchMore()){m_model->fetchMore();} 但实际使用发现效率…

redis多用户管理

最近在学redis&#xff0c;由于笔者是学运维的&#xff0c;所以推荐学习运维的小伙伴参考&#xff0c;希望对大家有帮助&#xff01; redis运维上篇:http://t.csdnimg.cn/MfPud redis运维下篇:http://t.csdnimg.cn/83sQ1 从redis6开始&#xff0c;默认用户名为default&#x…

c++容器与算法概述

容器与算法 每个标准库容器都提供了begin() end() 函数&#xff0c;分别返回容器的头部位置和尾部位置。 I/O 流 对于自定义的类型&#xff1a; struct Entry {std::string name;int number;};如果需要使用标准输出需要重载<< 运算符&#xff0c;特别注意&#xff1a…

云计算中的网络服务

网络服务是云计算平台不可或缺的一部分&#xff0c;为用户提供构建、管理、保护云环境中网络资源的能力。以下是对列举的七种网络服务——虚拟私有云&#xff08;VPC&#xff09;、负载均衡、内容分发网络&#xff08;CDN&#xff09;、云防火墙、专用网络连接&#xff08;专线…