背景
問題:
為什么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允許父組件在對子組件進行正測測量之前,先測量一下這個子組件的“固有尺寸”,換大白話說就是,子組件內容的最大或者最小尺寸是多少,這其實就先進行這種粗略的測量,然后再進行最終的正式測量。