【发布时间】:2014-09-25 11:41:59
【问题描述】:
可能大多数 Android 开发人员都知道findViewById 并不是一个便宜的操作。我们大多数人都知道的另一件事是,您可以通过使用视图层次结构的最小子树来通过 id 查找视图来提高性能,例如:
<LinearLayout
android:id="@+id/some_id_0">
<LinearLayout
android:id="@+id/some_id_1">
<LinearLayout
android:id="@+id/some_id_2">
<TextView android:id="@+id/textview" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
在这种情况下,您可能希望使用id == @id/textview 在LinearLayout 中进行搜索
但是,如果层次结构不是级联的,而是在每个级别上都有分支,并且您想在“叶子”上找到视图,假设是什么?您是否执行findViewById 以通过查找父级到达分支的底部,或者您是否在更大的子集上执行findViewById?我认为一个简单的答案是这取决于具体情况,但也许我们可以概括一下它真正取决于什么?
谢谢
编辑:
我所说的更大的子集是这样的:
<RelativeLayout android:id="@+id/r0">
<RelativeLayout
android:id="@+id/r1">
<LinearLayout
android:id="@+id/some_id_0">
<LinearLayout
android:id="@+id/some_id_1">
<LinearLayout
android:id="@+id/some_id_2">
<TextView android:id="@+id/textview0" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/some_id_3">
<LinearLayout
android:id="@+id/some_id_4">
<LinearLayout
android:id="@+id/some_id_5">
<TextView android:id="@+id/textview1" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:id="@+id/some_id_6">
<LinearLayout
android:id="@+id/some_id_7">
<LinearLayout
android:id="@+id/some_id_8">
<TextView android:id="@+id/textview2" />
<TextView android:id="@+id/textview3" />
<TextView android:id="@+id/textview4" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
所以问题是如果我想在LinearLayout 和@+id/some_id_8 中查看findViewById TextView 视图,我应该在整个容器上执行此操作,还是应该在findViewById LinearLayout 和@+id/some_id_8 和在这个视图上findViewById 所有TextViews?
【问题讨论】:
-
您能否解释一下您的 2 个备选方案,尤其是“更大子集上的 findViewById”?
-
请检查我的编辑。
-
default traversal 是深度优先。首先查找子树听起来像是微优化,它使代码更难维护。衡量一下是否真的有影响
-
正如 laalto 已经提到的 findViewById() 将遍历整个视图层次结构,因此使用两个 findViewById() 调用不会有任何区别(除了您将有一行额外的代码)。如果您对视图层次结构有深入的了解,则可以使用 getChild() 和 findViewById() 的组合,这在某些情况下应该更快(这并不重要),但会使代码对任何未来的更改都非常严格。最后,视图层次结构的深度和大小对于性能而言将比搜索这些视图更重要。
标签: android performance android-layout findviewbyid