【发布时间】:2013-07-03 20:21:25
【问题描述】:
一些常用的android布局如 RelativeLayout 和 LinearLayout(当权重不为零时) 有 onMeasure() 实现来测量他们的孩子 两次,导致嵌套时的指数运行时间。 这很容易通过发出日志条目来验证 从叶子视图的 onMeasure()... 它被称为 2depth 次。
谁能给出一个清晰而具体的描述为什么会这样? 最重要的是,这种指数行为是否归因于重要部分 整体合同,还是只是一个实施细节 那可能会被优化掉?如果认为这是不可避免的, 请举一个需要它的例子。
这样的例子会对我和其他人有很大帮助 谁在抱怨“让你的布局保持浅薄” 任务繁重,谁在想 这是否只是由 核心库中尚未优化的算法, 或者是否真的存在根本性的困难 阻止修复。
也许一个最小的例子包括 在另一个 LinearLayout 中的 LinearLayout 中的 Button (到处都有 match_parent 和 weight=1 来触发 全指数行为), 带有一些额外的参数或情况 清楚地表明所有四个电话 到 Button.onMeasure() 确实是有意义和必要的。
我的第一个猜测是只有两个线性时间 真正需要遍历——第一次遍历收集每个人的 首选大小,第二次遍历分配松弛 和/或收缩。 世界上的其他布局引擎,例如 Tex 和 Swing 以及 HTML 的布局引擎, 似乎能够经常处理非常深的层次结构 有很多对齐约束和拉伸, 没有任何指数爆炸,我想这就是它们的工作方式。
请注意,我不想要解释如何的答案 发生指数级爆炸——我明白, 并且已经有好几个帖子了 问与答:
- Why are nested weights bad for performance? Alternatives?
- Android layout measuring time doubles with each step up the hierarchy
- Layout Weight warning Nested weight bad performance
- Efficiency of Android Layout hierarchy
- http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html
我的问题是递归双重测量是否是 从根本上必要/合理, 如果是这样,我想要一个清楚的解释/示例来说明原因。
编辑 2013/8/22:我想我的问题可能还没有解决。 我将尝试澄清和解释我的动机,这次更大胆。
布局不是一个指数级的难题, 正如世界上高效的布局引擎所证明的那样,例如 Tex 和 Swing 以及 HTML。
那么,LinearLayout 发生了什么, android 开发者社区应该如何应对? 我不是本着责备的精神要求, 而是要了解并决定如何最好地前进。
我能想到 4 种可能性:
- 修复核心库中的性能错误,无需更改任何合约
- 根据需要更改合约,并修复 核心库
- 写一个LinearLayout的替代方案,它有它的本质 功能(即以指定比例在子项之间分配额外空间)但没有性能错误,并将其用于新应用
- 继续微观管理我们的布局以解决 我们其余的 android 开发生涯都存在性能问题。
(4) 对我个人来说不是一个严肃的选择。 此外,我似乎很清楚 此时改变 LinearLayout 的行为是不切实际的, 所以我也不认为(2)是一个严肃的选择。
剩下 (1) 和 (3)。 我有能力并且愿意亲自做任何一个,但是哪一个呢? 显然,如果可能的话,(1)是更可取的——那么,有可能吗? 这似乎是需要回答的关键阻塞问题 以便确定如何前进。
我在核心代码上花了一些时间 和文档,它并不清楚, 所以这就是我在这里问这个问题的原因。
【问题讨论】:
-
+1 非常清晰的问题,研究表明您没有问什么。
-
很棒的帖子。如果可以的话,直接将其发送给 Romain Guy,以便有更好的机会获得有价值的反馈。 :)
标签: android android-layout android-linearlayout