视频先行

假定你便利看视频,直接去 哔哩哔哩 或许 YouTube 看视频就好,下面的文章就不用看了。假定你不便利看视频,下面是视频内容的脚本收拾稿。

开场

Android 开发的都知道一个规则:布局文件的界android是什么手机牌子面层级要尽android的drawable类量地少,越少越好,android手机由于层级的添加会大幅拖慢界面的加载。这种拖慢的主算法的五个特性要原因就在于各种 Layout 的重复丈量。尽管重复丈量关于布局进程是必不行少的,但这也的确让界面层级的数量对加载时刻的影响变成了指数级。而 J算法的时刻复杂度取决于etpack Compose 是不怕层级嵌Android套的,由于它从本源上处理了这种问题。它处理的方法也非常美妙而简略——它不许重复android体系丈量。

……嗯?

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

View 层数和界面加载功用的关系

大家好,我是扔物线朱凯。

在定制 ViewGroup 的布局进程的时分,咱们需求重写两个方法: onMeasurhttp 404e()用来丈量子 View,onLayout()用来摆放丈量好的子 View。丈量和摆放分明是连续的进程,为什么要拆成两步呢?由于咱们在 ViewGroup 里或许会对子 View 进行屡次丈量。

比方一个纵向的 LinearLayout,当它的宽度被设置成了 wrap_content的时分:

<算法LinearLayout xmlns:aandroid平板电脑价格ndroid="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_heiandroid下载安装ght="wrap_content"
android:orientation="vertical">
...
</LinearLayout>

它会依次丈量自己悉数的android体系子 View,然后把它们最宽的那个的宽度作为自己究竟的宽度。

但……假定它内部有一个子 View 的宽度是 match_parent

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
androiandroid手机d:layout_width="wrap_content"
android:layoutandroid平板电脑价格_heigh算法剖析的意图是t="wrap_content"
android:orientation=http 404"vertical">
<View
android:layout_width="match_parent"
android:layout_height="48dp" />
<View
android:layout_wi算法是什么dt算法工程师h="120dp"
android:layout_height="48dp" />
<View
android:layout_android/yunoswidth="160dp"
android:layout_height="48dp" />
</AndroidLinearLayout>

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic MeasurementView 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic MeasurementView 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic MeasurementView 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic MeasurementView 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

这时分, Linhttps和http的差异earLayout就会android下载安装先以 0 为强制宽度丈量一下这个子 View,并正常地丈量剩下的其他子 View,然后再用其他子 View 里最宽的那个的宽度,android的drawable类二次丈量这个 match_parent的子 View,究竟得出它的规范,并把这个宽度作为自己究竟的宽度。

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

这是对单个子 View 的二次丈量,假定有多个子 View 写了 match_parenandroid手机t,那就需求对它们每一个都进行二次丈量。

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

而假定悉数的子 View 全httpwatch都是 mathttp协议ch_parent——哎http署理呀跑题了。总之,在 Android 里,一个 ViewGroup 是或许对子 View 进行二次丈量的。不仅仅二次,有时分还会出现三次甚至更屡次的丈量。并且这不是特别场景,重复丈量在 Android 里是很常见的。

重复丈量是android什么意思 ViewGroup算法剖析的意图是 完成正确丈量所必需的手段,但一起httpclient也让咱们需求非常留意尽量削减布局的层android下载安装级。

为什么呢?来看一个最简略的比方,假定咱们的布局有两层,其间父 View 会对每个子 View 做算法的三种根本结构二次丈量,那它的每个子 View 总共需求被丈量 2 次:

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

假定添加到三层,并且每个父 View 仍然都做二次丈量,android/yunos这时分最下面的子 View 被丈量的次数就直接翻倍了,变成 4 次:

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

同理,添加到 4 层的话会再次翻倍,子 View 需求被丈量 8 次:

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

也便是说,关于会做二次丈量的体系,每个 Vie算法w 的丈量算法的时刻凌乱度是 O(2ⁿ) ,其间这个 n 是 View 的层级深度。

当然了,实践中并不是每个父 View 都会进行二次丈量,以及有些父 View 会对子 View 做三次或许更屡次的丈量,所以这仅仅一个大约估计,不过——大致便是这个数量级了。

而 O(2ⁿ) 这种指数型的时刻凌乱度,说白了便是,View 的层级每添加 1,加载时刻就会翻一倍。

所以为什么 Android 官方文档会建议咱们的布局文件少一些层级?由于它算法的有穷性是指对功用的影响太大了!

Compose 的 Intrinsic Measurement

而 Compose 是阻止二次丈量的。

假定每个父组件对每个子组件只丈量一次,那就直接意味着界面中的每个组件只会被丈量一次:

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

这样的话,就把组件加载的时刻凌乱度从HTTP O(2ⁿ) 降到了 O(nhttp://www.baidu.com)。

不过……假定禁用二次丈量这么好用的话,Androidhttp 500 干嘛不在传统算法的时刻复杂度取决于的 View 体系直接禁掉?——由于它有用啊!

那 Compose 禁用了二次丈量,它就不用了吗?

这便是 Compose 美妙的当地了:Compose 禁用了算法的时刻复杂度是指什么二次丈量,但加入了一个新东西:Intrinsic Measurement,官方把它翻译做「固有特性测算法工程师量」。

这个「固有特性丈量」,你android什么意思要说翻译得不对吧,其实字面上现已非常算法的有穷性是指准确了,但这么翻却又完全没捉住这个功用的魂灵。

所谓的 Intrinshttp署理ic Measurement,指的是httpclient Compose 答应父组件在对子组件进行丈量之前,先丈量一会儿组件的「固有规范」,直白地说便是「你内部内容的最大或许最小规范是多少」。这是一种大约的丈量,android下载安装尽管没android体系有实在的「二次丈量」方式那么自在,但功用并HTTP不弱,由于各种 Layout 里的重复丈量,其实算法导论本来便是先进行这种「大约丈量」再进行究竟的「正式丈量」的——比方算法的三种根本结构刚才说的那种「外面 wrap_content里边 match_pahttp://www.baidu.comrent」的,对吧?想想是不是?这android的drawable类种「大约」的丈量是很轻的,并不是由于它量得快,而androidstudio安装教程是由于它在机制上不会像传统的二次丈量那样,让组件的丈量时刻随着层级的加深而不断加倍。

当界面需求这种 Intrinsic算法的五个特性 Measurement——也便是说那个所谓的「固有特性丈量」——的时分,Compose 会先对整个组件树进行一android下载次 Intrinsic 丈量,然后再对整体进行正式的丈量。这样拓荒两个平行的丈量进程,就能够避免因http://www.baidu.com为层级添加而对同一个http://192.168.1.1登录子组件反复丈量所导致的丈量时刻的不断加倍了。

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

总结成一句话便是,在 Compose 里张狂嵌套android体系android下载写界面,和把悉数组件全都写进同一层里边,功用是相同的!

这…androidstudio安装教程…还怕嵌套?

刚才那个「固有特性丈量」的翻译,我为什么觉得没有魂灵呢,主要是那个「固有特性」指的其实便是「固有规范」,也便是这个组件它本身的宽度和高度。而翻译成「固有特性丈量」就有点太直了,直到反而让含义有点曲解了。不过无伤大雅啊,不管是「固有规范丈量算法」仍是「固有特性丈量」,这个android是什么手机牌子规划真的很好,它让 Compose 逃过了 Android 原生 View 体系里的一个功用骗局。

事实上,你用一用 Compose 也会发现,它的功用算法剖析的意图是现已在一些方面跨过原生了——尤其是关于凌乱场景,比方多组android体系件一起参与的动画。不过现在为止,还仅仅一些方面罢了,并没http 500有全方位跨过。比方滑动列表的功用,Compose 现在是不如原生的 Recyandroid下载安装clerView 的。现在 Compose 的正式版发布现已算法的时刻复杂度取决于越来越近了,并且从发布日志来看,现在 Compose 的开发重心还在 API 完整性的添补和 Bug 修正上,所以到了正式发布那天能不能看到 Compose 全方位跨过原生的功用,我是有算法的时刻复杂度是指什么点怀疑的。不过从原理上看,就算发布的时分算法导论不行,未来应该是有或算法规划与剖析许的。

总结

假定你做 Android 开发,Compose 真的是时分了解一下了。我今后还会发布更多关于 Compose 以及 Android 开发相Android关的内容,所以重http://192.168.1.1登录视我吧,没错的!假定你想快速成为 Compose 高手,也能够了解一下我的 Compose 课程httpclient,我的同名群众号「扔物线」里边有免费试听课。

View 嵌套太深会卡?来用 Jetpack Compose,随意套——Intrinsic Measurement

好了今日的内容就http://www.baidu.com到这里,我是算法剖析的意图是扔物线,我欠好你比凹凸,我只助你生长,咱们下期见。