背景
问题:
为什么Compose可以无限嵌套而传统的xml却不可以?
要搞清楚这个问题首先还是得先了解二者绘制的差异,我说的可能不对,如果有问题,欢迎大家指出。
xml
以前我们用传统的xml绘制布局的时候都是要尽量减少布局的层级关系,以提升性能,因为层级的增加,会大幅拖慢界面的加载。这种拖慢的主要原因在于各种Layout的重复测量。尽管从客观上来说重复测量都布局来说是必不可少的,但它也确实使页面的加载时间随着页面层级的增加而产生了指数级的增长。一个ViewGroup对子view的测量可能是二次,三次甚至多次测量。对于一个会二次测量的系统来说,它的每个View的测量算法的时间复杂度是O(2^n),其中n是View的层级深度。当然了,这只是一个粗略的估计,因为不是第个View都会进行2次测量,也有会进行三次甚至多次测量。一句话说是就是,这种测量方式会导致View的层级每加深一级,它的加载时间就会翻一倍。
Compose
Compose可以无限套娃的原理也很简单,那就是禁止二次测量。如果每个组件对每个子组件只测量一次,那它的时间复杂度则降低到了O(n)。
为什么Compose可以禁止二测量
既然禁止二次测量可以极大提升View的布局效率,那为什么传统的View不直接禁掉?因为有用呗。既然有用,那Compose就不用了吗?因为Compose引入一个新的概念——Intrinsic Measurement,官方翻译叫固有特性测量。所谓的固有特性测量就是Compose允许父组件在对子组件进行正测测量之前,先测量一下这个子组件的“固有尺寸”,换大白话说就是,子组件内容的最大或者最小尺寸是多少,这其实就先进行这种粗略的测量,然后再进行最终的正式测量。