Фрагмент, вызывающий пропуск кадров при повороте экрана - PullRequest
0 голосов
/ 14 января 2019

У меня есть фрагмент, который отображает более 33 видов текста и линейный график. Поворот экрана очень медленный, и Android Studio говорит: «Я / Хореограф: пропущено 49 кадров! Возможно, приложение выполняет слишком много работы над своим основным потоком». Количество пропущенных кадров увеличивается с каждым новым поворотом. Этого не происходит, если данные отображаются в самом действии (т.е. не во фрагменте). Даже если я закомментирую каждую строку кода, имеющую дело с данными, и оставлю только минимальный каркас фрагмента, проблема не исчезнет. Я не знаю, что я делаю неправильно, но, поскольку проблема сохраняется, даже если данные не обрабатываются, я полагаю, что это связано с компоновкой?

Активность:

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
    ButterKnife.bind(this);

FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    SensorDataFragment dataFragment = new SensorDataFragment();
    fragmentTransaction.add(R.id.fragment_container, dataFragment).commit();

Фрагмент:

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    ViewGroup rootView = (ViewGroup) inflater
            .inflate(R.layout.sensor_data_fragment, container, false);
    return rootView;
}

Схема деятельности:

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<com.google.android.material.appbar.AppBarLayout
    android:id="@+id/appbar_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        app:layout_scrollFlags="scroll"/>

</com.google.android.material.appbar.AppBarLayout>

<androidx.core.widget.NestedScrollView
    android:id="@+id/device_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/appbar_layout"
    android:visibility="gone"
    tools:visibility="visible"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>

</androidx.core.widget.NestedScrollView>

<RelativeLayout
    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"
    tools:context=".BlinkyActivity"
    tools:ignore="ContentDescription">

    <LinearLayout
        android:id="@+id/progress_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:visibility="gone"
        tools:visibility="visible"
        android:padding="@dimen/activity_horizontal_margin">

        <TextView
            android:id="@+id/connection_state"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:textSize="16sp"
            tools:text="@string/state_connecting"/>

        <ProgressBar
            android:id="@+id/progress_bar"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="250dp"
            android:layout_height="wrap_content"
            android:indeterminate="true"/>
    </LinearLayout>

    <include
        android:id="@+id/not_supported"
        layout="@layout/info_not_supported"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:visibility="gone"
        tools:visibility="visible"/>

</RelativeLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Фрагмент макета:

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.cardview.widget.CardView
        android:id="@+id/spect_card"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/activity_horizontal_margin"
        android:background="@android:color/white"
        app:cardElevation="1dp">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/spect_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/spect_tool_bar"
                android:layout_width="0dp"
                android:layout_height="?actionBarSize"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:logo="@drawable/outline_opacity_24"
                app:title="@string/title_spectrum"
                app:titleMarginStart="@dimen/toolbar_title_margin" />

            <TextView
                android:id="@+id/spect_summary"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:paddingStart="@dimen/activity_horizontal_margin"
                android:paddingEnd="@dimen/activity_horizontal_margin"
                android:text="@string/spectrum_summary"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/spect_tool_bar" />

            <com.github.mikephil.charting.charts.LineChart
                android:id="@+id/spect_chart"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingTop="@dimen/activity_horizontal_margin"
                android:paddingBottom="0dp"
                app:layout_constraintTop_toBottomOf="@+id/spect_summary" />

            <ImageView
                android:id="@+id/menu_numberformat"
                android:contentDescription="@string/menu_number_format_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingTop="@dimen/activity_horizontal_margin"
                android:paddingEnd="@dimen/activity_horizontal_margin"
                android:paddingStart="@dimen/activity_horizontal_margin"
                android:onClick="showNumberFormatPopup"
                app:srcCompat="@drawable/outline_more_horiz_24"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/spect_chart" />

            <TextView
                android:id="@+id/sensor_label_1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_horizontal_margin"
                android:paddingBottom="5dp"
                android:text="@string/sensor_label_1"
                app:layout_constraintLeft_toRightOf="@+id/f1_label"
                app:layout_constraintTop_toBottomOf="@+id/spect_chart" />

            <TextView
                android:id="@+id/sensor_label_2"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_horizontal_margin"
                android:paddingBottom="0dp"
                android:text="@string/sensor_label_2"
                app:layout_constraintLeft_toRightOf="@+id/sensor_label_1"
                app:layout_constraintTop_toBottomOf="@+id/spect_chart" />

            <TextView
                android:id="@+id/sensor_label_3"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_horizontal_margin"
                android:paddingBottom="0dp"
                android:text="@string/sensor_label_3"
                app:layout_constraintLeft_toRightOf="@+id/sensor_label_2"
                app:layout_constraintTop_toBottomOf="@+id/spect_chart" />

            <TextView
                android:id="@+id/f1_label"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:paddingEnd="32dp"
                android:paddingStart="@dimen/activity_horizontal_margin"
                android:paddingBottom="0dp"
                android:text="@string/f1_data_label"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/sensor_label_1" />

            <TextView
                android:id="@+id/s1f1_data"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingBottom="0dp"
                android:text="@string/spectrum_unknown"
                android:textStyle="bold"
                app:layout_constraintStart_toStartOf="@+id/sensor_label_1"
                app:layout_constraintEnd_toEndOf="@+id/sensor_label_1"
                app:layout_constraintLeft_toLeftOf="@+id/sensor_label_1"
                app:layout_constraintTop_toBottomOf="@+id/sensor_label_1" />
// a lot of more text views
</androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.cardview.widget.CardView>

</LinearLayout>

Может ли это быть вызвано макетом? Я имею в виду, если нет обработанных данных, что еще может вызвать проблему? Большое спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Система Android отображает 60 кадров в секунду. Это означает, что каждые 16 мс перерисовывается экран. (1000/60 = 16,6)

Поскольку мы могли бы прочитать об эффективных иерархиях компоновки, не создавайте много вложенных групп просмотра. Читать дальше .

Также рассмотрим ConstraintLayout , для относительного позиционирования.

0 голосов
/ 14 января 2019

Хореограф может обнаружить только пропуск кадра. Невозможно объяснить, почему это происходит.

но я думаю, что проблема возникла из-за большого объема данных, обработанных в вашем фрагменте

Лучший способ - выполнить всю обработку в потоке отдельно от основного потока пользовательского интерфейса, чтобы получить доступ к вашим данным, и затем нарисовать их

также такое поведение повторяющегося представления, как «TextView» с теми же свойствами, не очень хорошая идея для пользователя RecyclerView и передачи списка ваших данных адаптеру утилизатора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...