【问题标题】:May changing the visibility of too many layouts a performance issue?更改太多布局的可见性是否会成为性能问题?
【发布时间】:2017-06-28 16:39:00
【问题描述】:

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

每个LinearLayout是一个复杂视图,包含Button、EditText、TextView等。

<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 不会降低应用性能?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      祝你好运

      埃姆雷

      【讨论】:

      • 方法onLayout、onMeasure、onRequestFocusInDescendants、onDraw 仅在设置为View.VISIBLE 的视图上调用(在此序列上),而不是在View.GONE。我知道Fragment 或ViewFlipper 是一个cleaner 解决方案,但我怀疑是否也存在性能问题。
      【解决方案3】:

      说真的,您需要针对上述情况考虑片段。 为什么要夸大不必要的观点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多