使用Hierarchy Viewer工具移除不必要的视图

Hierarchy Viewer工具可以用来查看视图树(View Tree)并分析视图树中各个视图在测量、布局、绘制阶段所消耗的时间。通过该工具提供的信息,开发者可以找出视图树中那些不必要的视图以及性能瓶颈。在这个demo中,我们会分析查找并解决上述问题的方法。

为了演示这个demo,我创建了一个实验性质的应用程序,在该程序中显示几个执行比较慢的视图(指的是测量、布局、绘制三个过程比较慢的视图)。然后,我们会使用Hierarchy Viewer工具解决这个问题。本应用程序只有一个Activity。其界面和XML布局文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">

    <TextView  android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:text="@string/hello"/>

    <LinearLayout  android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical">

        <com.test.SlowMeasureView  android:id="@+id/slow_measure" android:layout_width="fill_parent" android:layout_height="30dp" android:background="#00ff00" android:text="@string/slow_measure"/>

        <com.test.SlowLayoutView  android:id="@+id/slow_layout" android:layout_width="fill_parent" android:layout_height="30dp" android:background="#0000ff" android:text="@string/slow_layout"/>

        <com.test.SlowDrawView  android:id="@+id/slow_draw" android:layout_width="fill_parent" android:layout_height="30dp" android:background="#ff0000" android:text="@string/slow_draw"/>

    </LinearLayout>
</LinearLayout>

使用Hierarchy Viewer工具移除不必要的视图_第1张图片

该应用程序只是对默认创建的应用程序做了一些小的改动。在布局底部添加了三个自定义视图并且移除了标题栏。该应用程序执行时,执行Hierarchy Viewer会看到如下图所示的结果。

使用Hierarchy Viewer工具移除不必要的视图_第2张图片

在本例中,我们找到了一个TextView;此外,还可以找到一个包含所有自定义视图的LinearLayout,也即图中第二个LinearLayout。我们还可以看到第二个LinearLayout中有3个用红色显示的性能指示器,表示该LinearLayout是视图树中执行最慢的视图。我们可以删除该LinearLayout。修改后的XML布局文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" >

    <TextView  android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:text="@string/hello" />

    <com.test.SlowMeasureView  android:id="@+id/slow_measure" android:layout_width="fill_parent" android:layout_height="30dp" android:background="#00ff00" android:text="@string/slow_measure" />

    <com.test.SlowLayoutView  android:id="@+id/slow_layout" android:layout_width="fill_parent" android:layout_height="30dp" android:background="#0000ff" android:text="@string/slow_layout" />

    <com.test.SlowDrawView  android:id="@+id/slow_draw" android:layout_width="fill_parent" android:layout_height="30dp" android:background="#ff0000" android:text="@string/slow_draw" />

</LinearLayout>

最终的修改方案减少了一个视图节点,降低了视图树的高度。创建视图时,一定要避免产生过高的视图树。Android绘制布局由两次遍历过程组成:测量过程和布局过程。如果视图树有太多节点,遍历该树就会消耗更长时间。

修改XML布局文件生成较低的视图树层次后,一定要看看性能指示器。性能指示器显示的是当前视图与视图树中其他视图相比的相对结果,因此不要被结果蒙蔽。大部分性能指示器显示绿色并不表示这些视图一定是合理的,此时需要检查绘制每个视图花费的时间并确保一切运行良好。

Hierarchy Viewer工具是查看视图树的强大工具。开发应用程序时,使用该工具分析视图树的层次结构,确保当前布局能生成响应灵敏的UI界面并且使用了最低的树层次。

代码地址

你可能感兴趣的:(hierarchy,viewer)