网页设计服装网站建设,站长之家备案查询,软件技术专升本需要考什么,阿里云 wordpress cdn做过布局性能优化的同学都知道#xff0c;为了优化界面加载速度#xff0c;要尽可能的减少布局的层级。这主要是因为布局层级的增加#xff0c;可能会导致测量时间呈指数级增长。
而Compose却没有这个问题#xff0c;它从根本上解决了布局层级对布局性能的影响: Compose界…做过布局性能优化的同学都知道为了优化界面加载速度要尽可能的减少布局的层级。这主要是因为布局层级的增加可能会导致测量时间呈指数级增长。
而Compose却没有这个问题它从根本上解决了布局层级对布局性能的影响: Compose界面只允许一次测量。这意味着随着布局层级的加深测量时间也只是线性增长的.
下面我们就一起来看看Compose到底是怎么只测量一次就把活给干了的,本文主要包括以下内容
布局层级过深为什么影响性能?Compose为什么没有布局嵌套问题?
①布局层级过深为什么影响性能?
我们总说布局层级过深会影响性能那么到底是怎么影响的呢主要是因为在某些情况下ViewGroup会对子View进行多次测量
举个例子
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthwrap_contentandroid:layout_heightmatch_parentandroid:orientationverticalViewandroid:layout_widthmatch_parentandroid:layout_height100dpandroid:backgroundandroid:color/holo_red_dark /Viewandroid:layout_width100dpandroid:layout_height100dpandroid:backgroundandroid:color/black /
/LinearLayoutLinearLayout宽度为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全家桶篇内含Composehttps://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