java - 提高与 ViewFlipper 一起使用的实例化和膨胀 View 的性能

标签 java android xml android-layout user-interface

我正在使用 ViewFlipper 来显示应用所做的所有测量(1 个测量 = 1 个页面元素)。问题是,如果有超过 50 个元素,初始化/重新加载 ViewFlipper 内容的性能会变得非常糟糕。即,应用程序在启动后大约 15 秒内没有响应。我做了一些日志记录,发现超过 70% 的加载时间花在了 View.inflate(ctx, R.layout.view_measurement, null);

根据我的理解,inflate(...) 确实将布局 xml 文件解析为 View ,因此它可以在 Java 中使用。由于布局 xml 文件每次都是相同的,所以在我看来,每个元素都在一遍又一遍地完成同样繁重的工作。我尝试了很多方法来改变这一点,只让这种情况发生一次,不幸的是没有成功。我也尝试在 xml 中使用和标记,但总是出错。

我知道有比 ViewFlipper 更好的方法来完成这项工作,但由于我很匆忙,其他一切都很好,我想保留它并找到一个快速的解决方案。

主 Activity .java

...

ViewFlipper viewFlipper;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    viewFlipper = (ViewFlipper)super.findViewById(R.id.measurementsViewFlipper);

    int measurementsAmount = 100; //example

    for(i=0; i<measurementsAmount; i++){

        View measurementView = View.inflate(ctx, R.layout.view_measurement, null);

        ... fill the view ...

        viewFlipper.add(measurementView);

    }

    ...

}

view_measurement.xml

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

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal">


    ...


</LinearLayout>
</RelativeLayout>

最佳答案

减少 xml 膨胀时间的唯一方法是减少 xml 布局中使用的 View 数。例如,只需查看您发布的布局,您就可以(并且应该)删除根 RelativeLayout,如果它只是包装 LinearLayout。此外,使用 ConstraintLayout 可能允许您进一步删除 ViewGroup 并减少嵌套级别和 View 数。

但这仍然不行,因为真正的问题是您预先夸大了很多 View 。在您的示例中,如果页面布局仅包含 5 个 View ,您将总共创建 500 个 View (100 x 5)。这太多了,这就是为什么您需要一个 View 回收机制,这样您就不需要预先创建所有 View ,只需为当前页面创建一些 View 。

如果您想要 ViewFlipper 的行为,Android SDK 有一个名为 AdapterViewFlipper 的组件你应该使用它。它只需要一个额外的适配器类,您将向其传递测量数据并在其中扩展测量布局。

关于java - 提高与 ViewFlipper 一起使用的实例化和膨胀 View 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49795128/

相关文章:

java - Spring JPA TransactionManager 未找到

java - 如何使用 JOOQ 或任何其他库使用以下数据构建方言敏感的 SQL 查询?

java - CompletableFuture 跨微服务(JVM)

java - 为什么调用 CallStaticVoidMethod 在 JNI 中抛出使用无效的 jobject

sql-server - SQL Server 中的 XQuery 与 OpenXML

java - Jaxb 强制继承类的属性首先被解码

java - 如何设置水平滚动 Pane 的起始位置在左端?

java - 如何使用自定义 TypefaceSpan 类更改字体大小

android - 使用 gradle-experimental :0. 2.0 签署 android apk

java - 滚动时如何修复折叠工具栏中的 View ?