关闭

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

标签: HierarchyViewer
363人阅读 评论(0) 收藏 举报
分类:

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会看到如下图所示的结果。

这里写图片描述

在本例中,我们找到了一个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界面并且使用了最低的树层次。

代码地址

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:69886次
    • 积分:1597
    • 等级:
    • 排名:千里之外
    • 原创:86篇
    • 转载:0篇
    • 译文:0篇
    • 评论:13条
    最新评论