我正在使用 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/