使用包含大量TextView的relativeLayout显示性能

时间:2011-11-18 18:19:11

标签: android android-layout

在使用包含153 TextView的RelativeLayout(包装到ScrollView中)时遇到性能问题。每个TextView都有9个补丁背景。

主要布局:

<ScrollView 
    android:id="@+id/forum_accueil_ScrollView"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:background="@color/white">
    <RelativeLayout android:id="@+id/forum_accueil_RelativeLayout"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        android:background="@color/white">
    </RelativeLayout>
</ScrollView>

RelativeLayout以编程方式填充TextViews(项目计数和描述来自WS)。每个TextView都有一个9patch背景选择器。 TextView描述如下:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="35dip"
    android:textColor="@color/myblue"
    android:textStyle="bold"
    android:gravity="center_vertical" android:layout_gravity="center_vertical"
    android:background="@drawable/selector_forum_accueil_item">
</TextView>

最后,我有一个包含153 TextView的RelativeLayout。显示和滚动非常慢。即使回到这项活动也需要一些时间。

我打开了Hierarchy查看器,ScrollView需要以下时间才能显示:

测量:28ms 布局:1.2ms 平局:18ms

有没有办法加快显示和响应速度?包含尽可能多的视图的单个RelativeLayout是最好的方法吗(我试图用这种技术尽可能地压平层次结构)? 我尝试删除9补丁背景进行测试,似乎响应更快。为什么呢?

2 个答案:

答案 0 :(得分:1)

这是一个淫秽的TextViews。此时使用ListView。你的RelativeLayout为你做了什么(在这个例子中)ListView不能做什么?

答案 1 :(得分:0)

您的问题非常明确:为什么渲染/布局时间在取出9补丁背景后响应更快?实际上有两个好的答案:

  1. 使用包含背景属性的样式指定背景属性要慢得多。使用GPU缓存样式,以便它已经了解背景并使用它。如果您没有指定样式,则无论如何都会使用样式(默认样式),并且 包含某种背景,并且首先应用它。然后应用特定于视图的属性,即重新呈现指定的背景。
  2. 9-patch图片 可以更多更长时间来渲染。再加上你要求它渲染153次并且性能会呈指数级下降的事实。我现在正在看一个案例,在那里我经常看到&#39;定期&#39; .png位图在1.5毫秒内渲染,而同一布局中的一个非常简单的9补丁在45毫秒时慢30倍。
  3. 警告经验:9-patch渲染经常,但并不总是受GC循环的影响,该循环占渲染时间的80%。在某些情况下,我看到这个GC循环在渲染其他位图/光栅图像时发生,但在<9-patch渲染过程中 似乎更频繁地发生。