可能会将太多布局的可见性更改为性能问题?

时间:2017-06-28 16:39:00

标签: android performance android-layout leakcanary timber-android

假设您的FrameLayout包含10 LinearLayouts,其中每次只有一个可见。

每个LinearLayout都是一个复杂的视图,包含ButtonEditTextTextView等。

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/alice
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible">

        <!-- complex stuff -->

    </LinearLayout>

    <!-- many more linear layouts... -->

    <LinearLayout
        android:id="@+id/juliett
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone">

        <!-- last complex stuff -->

    </LinearLayout>

</FrameLayout>

因此:

  1. 更改LinearLayout展示次数以显示其他项目会是一个巨大的性能问题?
  2. 鉴于这是一个问题,为什么使用ViewFlipper不会降低应用效果?

3 个答案:

答案 0 :(得分:1)

这不是一种好的实现方式,因为每次需要显示另一个视图时,其他视图都必须消失。因此,您将为其编写重复的代码行。 Viewswitcher是更好的选择。那么性能呢?视图切换器将测量所有子视图,这些视图仅在其内部绘制。此技巧使视图切换器更快,因为除非您禁用它以使用异构子视图,否则它不需要重新计算自身的维度。

如果您的观点是同质的,最好的方法是实现自定义视图并为更改状态提供类。例如,您将Alice对象设置为自定义视图以显示Alice的属性,并以编程方式将其更改为您的业务逻辑。

祝你好运

埃姆雷

答案 1 :(得分:1)

这是不好的做法,因为代码容易变得一团糟。忽略这一点并仅关注性能,当您将可见性设置为GONE时,视图不会被测量(它与INVISIBLE不同)。但是,视图占用了一点点内存。根据您的工作情况,请考虑使用ViewGroup.removeView()

没有基准测试很难说,但理论上它不应该有性能问题。

答案 2 :(得分:-1)

说真的,你需要考虑上述情况的碎片。 为什么要夸大不必要的观点。