我在Android中有一个对话框。打开时会有明显的滞后。这是我所做的调查:
使用System.currentTime的粗略计时,我的onCreateDialog方法在美好的一天需要150毫秒,而在正常的一天需要500-700毫秒。
我实现了自己的LayoutInflator.Factory。我的工厂什么也没做。它只返回null即可让默认工厂完成工作。但是它会写出自上次通话以来经过的时间。这样,我就可以打印出布局xml中的每个标签需要花费多长时间的打印输出。非常令人惊讶的是,每个元素的充气过程大约需要20-70ms!
我对应用程序进行了配置。看来确实确实有很多时间花费在视图的构造函数或LayoutParams中。
对于粗略的检查,我测量了使用System.currentTime在TextView上调用构造函数的时间。事实证明,这是在强大的Alienware PC上的仿真器中,实例化TextView对象需要20-70ms!似乎需要花费很长时间。
作为参考,版面膨胀,测量和渲染之间存在差异。我现在只关心通货膨胀的表现。
这是我实现LayoutInflator.Factory进行测量的方式:
LayoutInflater inflater = LayoutInflater.from(getActivity());
LayoutInflater inflater2 = inflater.cloneInContext(getActivity());
inflater2.setFactory(new LayoutInflater.Factory() {
long inner = System.currentTimeMillis();
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
Log.d(LOG_TAG, "onCreateView: Called factory for " + name + " took " + (System.currentTimeMillis() - inner));
inner = System.currentTimeMillis();
return null;
}
});
以下是输出:
Called factory for TextView took 34
Called factory for TextView took 30
Called factory for android.support.constraint.Guideline took 76
...
这是我如何测量实例化TextView和LayoutParams对象的时间。
Log.d(LOG_TAG, "onCreateDialog: 10 " + (System.currentTimeMillis() - last)); last = System.currentTimeMillis();
new TextView(getActivity());
Log.d(LOG_TAG, "onCreateDialog: 11 " + (System.currentTimeMillis() - last)); last = System.currentTimeMillis();
new ConstraintLayout(getActivity().getApplicationContext());
Log.d(LOG_TAG, "onCreateDialog: 12 " + (System.currentTimeMillis() - last)); last = System.currentTimeMillis();
这是我的版式,但是应用中的所有版式似乎都受速度的影响:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/remote_message_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/remote_dialog_message"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/building_name_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:textColor="#000"
android:textSize="32sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/remote_message_text_view"
tools:text="Bakery"/>
<ImageView
android:id="@+id/building_icon_image_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:contentDescription="@string/building_icon_content_description"
app:layout_constraintEnd_toEndOf="@+id/right_guide_line"
app:layout_constraintStart_toStartOf="@+id/left_guide_line"
app:layout_constraintTop_toBottomOf="@+id/building_name_text_view"
tools:src="@drawable/bakery"/>
<TextView
android:id="@+id/action_heading_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="8dp"
android:paddingStart="8dp"
android:paddingTop="8dp"
android:text="@string/actions_heading"
android:textAllCaps="true"
android:textColor="#000"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/building_icon_image_view"/>
<android.support.v7.widget.GridLayout
android:id="@+id/action_grid_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingEnd="8dp"
android:paddingStart="8dp"
app:columnCount="3"
app:layout_constraintTop_toBottomOf="@+id/action_heading_text_view"
tools:layout_height="100dp"/>
<TextView
android:id="@+id/production_rules_heading_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="8dp"
android:paddingStart="8dp"
android:paddingTop="8dp"
android:text="@string/production_rules_heading"
android:textAllCaps="true"
android:textColor="#000"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/action_grid_layout"/>
<TextView
android:id="@+id/production_rules_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="8dp"
android:paddingStart="8dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/production_rules_heading_text_view"
tools:text="1 flour creates 1 bread."/>
<TextView
android:id="@+id/production_speed_heading_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="8dp"
android:paddingStart="8dp"
android:paddingTop="8dp"
android:text="@string/production_speed_heading"
android:textAllCaps="true"
android:textColor="#000"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/production_rules_text_view"/>
<TextView
android:id="@+id/production_speed_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="8dp"
android:paddingStart="8dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/production_speed_heading_text_view"
tools:text="1 peasant produces 1 unit per 60 minutes.\n(Add a peasant to cut the time to 30 minutes.)"/>
<TextView
android:id="@+id/countdown_heading_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="8dp"
android:paddingStart="8dp"
android:paddingTop="8dp"
android:text="@string/next_unit_count_down_heading"
android:textAllCaps="true"
android:textColor="#000"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/production_speed_text_view"/>
<TextView
android:id="@+id/countdown_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:textColor="#000"
android:textSize="32sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/countdown_heading_text_view"
tools:text="24 : 60 : 60"/>
<android.support.constraint.Guideline
android:id="@+id/left_guide_line"
android:layout_width="0dp"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_constraintGuide_begin="10dp"
app:layout_constraintGuide_percent=".33"/>
<android.support.constraint.Guideline
android:id="@+id/right_guide_line"
android:layout_width="0dp"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_constraintGuide_percent=".66"/>
</android.support.constraint.ConstraintLayout>
为什么膨胀布局太慢。如何加快速度?
答案 0 :(得分:-1)
创建视图只是LayoutInflater所做工作的一小部分。您没有初始化它们,没有将它们添加到它们的父项中,没有在它们上设置属性,没有创建LayoutParams,没有进行布局或度量传递。您甚至都没有解析xml。当您完成工作的10%时,将花费10%的时间。您的比较完全没有用。