Приложение выполняет слишком много работы в основном потоке, загружая файл макета XML - PullRequest
11 голосов
/ 29 сентября 2019

Я делаю сетку Судоку 9x9, где каждая из 81 ячеек сама является сеткой 3x3. Одна ячейка выглядит примерно так:

1 2 3

4 5 6

7 8 9

Каждое число представляет карандашные аннотации для этой ячейки. У меня есть файл с именем cell_layout.xml, представляющий это расположение 3x3.

Я уже в состоянии сгенерировать сетку, и код работает:

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.solver_principal);

        TableLayout sudokuGrid = (TableLayout) findViewById(R.id.sudokuGrid);
        sudokuGrid.setShrinkAllColumns(true);
        sudokuGrid.setStretchAllColumns(true);

        TableRow.LayoutParams paramsRow = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
        TableLayout.LayoutParams paramsLayout = new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT);

        for(int i = 0; i < 9; ++i)
        {
            TableRow tableRow = new TableRow(SolverActivity.this);
            tableRow.setDividerDrawable(getResources().getDrawable(R.drawable.column_divider));
            tableRow.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
            for(int j = 0; j < 9; ++j)
            {
                View cell = getLayoutInflater().inflate(R.layout.cell_layout, sudokuGrid, false);
                cell.setLayoutParams(paramsRow);
                tableRow.addView(cell);
            }

            tableRow.setLayoutParams(paramsLayout);
            sudokuGrid.addView(tableRow);
        }

    }

Приведенный выше код просто увеличивает в 81 разтребуемый макет в TableLayout.

Это работает, так в чем же ваша проблема?

Создание действия занимает слишком много времени. Даже если я тестирую только с одной строкой сетки, метод будет слишком долго раздувать требуемый макет.

Я получаю:

Фоновое параллельное копирование GC освобождается 131244 (9 МБ)) Объекты AllocSpace, 0 (0B) LOS-объектов, 24% свободного, 74 МБ / 98 МБ, пауза 127us всего 444,411 мс

Пропущено 153 кадра! Приложение может выполнять слишком много работы над своим основным потоком.

Кто-нибудь может предложить лучший подход для моей ситуации? Действительно ли слишком много работы - генерировать в 81 раз сетку 3х3?

Спасибо

Редактировать

Так что теперь я попытался вручную записать файл xml. Я думал, что отсутствие необходимости много раз надувать xml улучшит ситуацию, но это не так. У меня все еще остается та же проблема «Слишком много работы в главном потоке», просто загружая файл XML.

<TableLayout
        android:id="@+id/sudokuGrid"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:divider="@drawable/row_divider"
        android:showDividers="middle"
        android:shrinkColumns="*"
        android:stretchColumns="*"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/solverTitle">

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="@drawable/column_divider"
            android:showDividers="middle">
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </TableRow>

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="@drawable/column_divider"
            android:showDividers="middle">
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </TableRow>

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="@drawable/column_divider"
            android:showDividers="middle">
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </TableRow>

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="@drawable/column_divider"
            android:showDividers="middle">
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </TableRow>

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="@drawable/column_divider"
            android:showDividers="middle">
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </TableRow>

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="@drawable/column_divider"
            android:showDividers="middle">
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </TableRow>

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="@drawable/column_divider"
            android:showDividers="middle">
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </TableRow>

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="@drawable/column_divider"
            android:showDividers="middle">
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </TableRow>

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="@drawable/column_divider"
            android:showDividers="middle">
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <include
                layout="@layout/cell_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </TableRow>

    </TableLayout>

А вот мой макет ячейки, на случай, если кто-то захочет попробовать.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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">

    <TextView
        android:id="@+id/cellValue"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        android:gravity="center"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/pencilOne"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        android:text="1"
        android:textSize="10sp"
        android:gravity="center"
        android:visibility="invisible"
        app:layout_constraintBottom_toTopOf="@+id/pencilFour"
        app:layout_constraintEnd_toStartOf="@+id/pencilTwo"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/pencilTwo"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        android:text="2"
        android:textSize="10sp"
        android:gravity="center"
        android:visibility="invisible"
        app:layout_constraintBottom_toTopOf="@+id/pencilFive"
        app:layout_constraintEnd_toStartOf="@+id/pencilThree"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/pencilOne"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/pencilThree"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        android:text="3"
        android:textSize="10sp"
        android:gravity="center"
        android:visibility="invisible"
        app:layout_constraintBottom_toTopOf="@+id/pencilSix"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/pencilTwo"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/pencilFour"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        android:text="4"
        android:textSize="10sp"
        android:gravity="center"
        android:visibility="invisible"
        app:layout_constraintBottom_toTopOf="@+id/pencilSeven"
        app:layout_constraintEnd_toStartOf="@+id/pencilFive"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/pencilOne" />

    <TextView
        android:id="@+id/pencilSix"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        android:text="6"
        android:textSize="10sp"
        android:gravity="center"
        android:visibility="invisible"
        app:layout_constraintBottom_toTopOf="@+id/pencilNine"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/pencilFive"
        app:layout_constraintTop_toBottomOf="@+id/pencilThree" />

    <TextView
        android:id="@+id/pencilSeven"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        android:text="7"
        android:textSize="10sp"
        android:gravity="center"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/pencilEight"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/pencilFour" />

    <TextView
        android:id="@+id/pencilEight"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        android:text="8"
        android:textSize="10sp"
        android:gravity="center"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/pencilNine"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/pencilSeven"
        app:layout_constraintTop_toBottomOf="@+id/pencilFive" />

    <TextView
        android:id="@+id/pencilNine"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        android:text="9"
        android:textSize="10sp"
        android:gravity="center"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/pencilEight"
        app:layout_constraintTop_toBottomOf="@+id/pencilSix" />

    <TextView
        android:id="@+id/pencilFive"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        android:text="5"
        android:textSize="10sp"
        android:gravity="center"
        android:visibility="invisible"
        app:layout_constraintBottom_toTopOf="@+id/pencilEight"
        app:layout_constraintEnd_toStartOf="@+id/pencilSix"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/pencilFour"
        app:layout_constraintTop_toBottomOf="@+id/pencilTwo" />
</android.support.constraint.ConstraintLayout>

Ответы [ 5 ]

6 голосов
/ 03 октября 2019

Для получения дополнительной информации о Application doing too much work in main thread Пожалуйста, обратитесь этот пост

https://stackoverflow.com/a/21126690/7666442

Вы должны использовать RecyclerView с GridLayoutManager

Выполните следующие действия

Сначала добавьте dependencies в свой файл Build.Gradle, чтобы использовать RecyclerView

implementation 'com.google.android.material:material:1.0.0-beta01'

Примечание: не нужно добавлять дополнительные dependencies из RecyclerView, если вы уже добавили dependencies из com.google.android.material:material

Теперь добавьте RecyclerView в макет файла своей деятельности

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:gravity="center"
    android:orientation="vertical"
    tools:context=".JavaActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:id="@+id/myRecyclerView"
        android:layout_height="wrap_content" />

</LinearLayout>

Теперь вам нужно использовать GridLayoutManager, чтобы отобразить элемент списка в виде сетки

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

public class JavaActivity extends AppCompatActivity {

    RecyclerView myRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_java);

        myRecyclerView = findViewById(R.id.myRecyclerView);

        GridLayoutManager gridLayoutManager = new GridLayoutManager(JavaActivity.this, 3);
        myRecyclerView.setLayoutManager(gridLayoutManager);
        myRecyclerView.setAdapter(new MyAdapter(this));
    }

}

Создать MyAdapter класс, подобный этому

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private Context context;

    public MyAdapter(Context context) {
        this.context = context;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.row_list_item, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.tvText.setText(String.valueOf(position + 1));
        if (position % 2 == 0) {
            holder.imgBanner.setBackgroundColor(Color.RED);
        } else {
            holder.imgBanner.setBackgroundColor(Color.GREEN);
        }
    }

    @Override
    public int getItemCount() {
        return 81;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView imgBanner;
        TextView tvText;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            imgBanner = itemView.findViewById(R.id.imgBanner);
            tvText = itemView.findViewById(R.id.tvText);
        }
    }
}

макет row_list_item

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/imgBanner"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:contentDescription="@string/app_name"
        android:src="@drawable/ic_launcher_background" />

    <TextView
        android:id="@+id/tvText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textColor="@android:color/white"
        android:textSize="15sp"
        android:textStyle="bold" />
</RelativeLayout>

ВЫХОД

enter image description here

2 голосов
/ 04 октября 2019

Создайте свои представления в другой теме:

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int 
    viewType) {

       new Thread(new Runnable() {
          public void run(){
               View view = 
               LayoutInflater.from(context).inflate(R.layout.row_list_item, 
               parent, false);
               return new MyViewHolder(view);
           }
       }).start();
    }
2 голосов
/ 03 октября 2019

Слишком много работы в главном потоке

Это означает, что ваш код занимает много времени на обработку, а кадры пропускаются из-за него, возможно, из-за некоторой интенсивной обработкичто вы делаете в основе вашего приложения или доступа к БД или любой другой вещи, которая заставляет поток остановиться на некоторое время. Прочитайте Android UI : Fixing skipped frames

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

Использовать расширенный для синтаксиса цикла

Улучшенный цикл for (также называемый иногда циклом «для каждого») можно использовать для коллекций, которыереализовать интерфейс Iterable и для массивов.

Пример

static class Foo {
    int splat;
}

Foo[] array = ...

public void zero() {
    int sum = 0;
    for (int i = 0; i < array.length; ++i) {
        sum += array[i].splat;
    }
}

public void one() {
    int sum = 0;
    Foo[] localArray = array;
    int len = localArray.length;

    for (int i = 0; i < len; ++i) {
        sum += localArray[i].splat;
    }
}

public void two() {
    int sum = 0;
    for (Foo a : array) {
        sum += a.splat;
    }
}

zero() самый медленный, потому что JIT пока не может оптимизироватьотнимите стоимость получения длины массива один раз для каждой итерации цикла.

one() быстрее. Он вытягивает все в локальные переменные, избегая поиска. Только длина массива обеспечивает выигрыш в производительности.

two() является самым быстрым для устройств без JIT и неотличимым от единицы () для устройств с JIT. В нем используется улучшенный синтаксис цикла for, представленный в версии 1.5 языка программирования Java.

FYI

Чтобы обеспечить плавное взаимодействие пользователя с вашим приложением, ваше приложение должно отображать кадры с интервалом менее 16 мс. достичь 60 кадров в секунду (почему 60 кадров в секунду?). Если ваше приложение страдает от медленного рендеринга пользовательского интерфейса, то система вынуждена пропускать кадры, и пользователь будет ощущать заикание в вашем приложении. Мы называем это джанк. Прочитайте Slow rendering.

Если Systrace показывает, что сегмент Layout в Choreographer # doFrame выполняет слишком много работы или выполняет ее слишком часто,означает, что вы сталкиваетесь с проблемами производительности макета. Производительность макета вашего приложения зависит от того, какая часть иерархии View имеет изменяющиеся параметры или входы макета.

Инструменты Android Profiler предоставляют данные в реальном времени, чтобы помочь вам понять, как ваше приложение использует ЦП,память, сеть и ресурсы батареи. См. Measure app performance with Android Profiler.

1 голос
/ 08 октября 2019

Вы боретесь не только с медленной инфляцией. Ваши 729+ видов также должны быть измерены и выложены, и это большая работа, учитывая все взаимные зависимости видов в вашем макете. (См. " Как Android рисует " .)

Вот один из способов решения проблемы, которая приведет к созданию сетки, которая, я думаю, вам нужна. Возможно, вам придется внести изменения в соответствии с вашими требованиями.

В следующем подходе используется FrameLayout , и он заполняется непосредственно TextViews , созданными в рабочем потоке. TextViews затем добавляются к FrameLayout в потоке пользовательского интерфейса. Размещение каждого TextView выполняется с использованием свойств translationX и translationY. Преимущество этого подхода заключается в том, что макет значительно упрощается, поскольку позиция каждого вида задается точно так же, как и размер каждого вида.

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

Вот вывод примера приложения:

enter image description here

SolverActivity.java

public class SolverActivity extends AppCompatActivity {
    int textViewWidth;
    int textViewHeight;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.solver_principal);
        final FrameLayout sudokuGrid = findViewById(R.id.sudokuGrid);

        // post to get the size of the sudoku grid post-layout.
        sudokuGrid.post(() ->
                new Thread(() -> {
                    textViewWidth = sudokuGrid.getWidth() / 27;
                    textViewHeight = sudokuGrid.getHeight() / 27;
                    createGrid(sudokuGrid);
                }).start());
    }

    @WorkerThread
    private void createGrid(FrameLayout sudokuGrid) {
        int blockWidth = textViewWidth * 3;
        int blockHeight = textViewHeight * 3;

        // row, col refers to the row and column of the 3x3 blocks of TextViews.
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
                int blockX = col * blockWidth;
                int blockY = row * blockHeight;
                // The block view covers the whole 3x3 TextView block.
                final TextView blockView = createTextView(blockX, blockY, null);
                runOnUiThread(() -> {
                    blockView.setBackgroundResource(R.drawable.outline);
                    sudokuGrid.addView(blockView, new FrameLayout.LayoutParams(blockWidth, blockHeight));
                });
                // Fill in the 3x3 block.
                for (int tvCell = 0; tvCell < 9; tvCell++) {
                    int transX = blockX + (tvCell % 3) * textViewWidth;
                    int transY = blockY + (tvCell / 3) * textViewHeight;
                    String text = String.valueOf(tvCell + 1);
                    final TextView tv = createTextView(transX, transY, text);
                    runOnUiThread(() ->
                            sudokuGrid.addView(tv, new FrameLayout.LayoutParams(textViewWidth, textViewHeight)));
                }
            }
        }
    }

    private TextView createTextView(int transX, int transY, @Nullable String text) {
        final TextView tv = new TextView(SolverActivity.this);

        if (text != null) {
            tv.setText(text);
        }
        tv.setTranslationX(transX);
        tv.setTranslationY(transY);
        tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10);
//                            tv.setVisibility(View.INVISIBLE);
        tv.setGravity(Gravity.CENTER);
        return tv;
    }
}

solver_principal.xml

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

outlined.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="1dp" android:color="#FFCCCCCC"/>
    <padding android:left="1dp" android:top="1dp"
        android:right="1dp" android:bottom="1dp" />
</shape>

Другим решением будет просто нарисовать на холсте FrameLayout . Вам придется обрабатывать прикосновения напрямую, но это, вероятно, будет самой быстрой реализацией.

0 голосов
/ 03 октября 2019

Intro

Позволяет использовать более общий подход (полезно для большего числа пользователей), независимо от из:

основной поток

Что делает main thread (много, не перегружается)это!)?

  • Основной поток по умолчанию, созданный при каждом запуске приложения Android.

  • Также известен как UI нить.

  • Он отвечает за обработку всех user interface и activities, если не указано иное.

  • Runnable isinterface предназначен для обработки общего кода между потоками.

  • Он содержит только один метод: run ().

from"Результаты поиска Google", "Рекомендуемый фрагмент из Интернета"

Inflation

Раздувание большого комплекса TableLayout в основном потоке insane !

(1) использование рабочих (фоновых) потоков процессов-and-threads

Существует два простых правила для модели потоков Android:

  • Не блокировать поток пользовательского интерфейса
  • Не получать доступ к Android UI toolkit извне потока UI (за исключением таких вещей, как AsyncLayoutInflater.)

(2) Попробуйте AsyncLayoutInflater .

SolverActivity.java :

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    final AsyncLayoutInflater.OnInflateFinishedListener callback = new AsyncLayoutInflater.OnInflateFinishedListener()
    {
        @Override
        public void onInflateFinished(View view, int resid, ViewGroup parent)
        {
           TableLayout sudokuGrid = (TableLayout) findViewById(R.id.sudokuGrid);
           sudokuGrid.setShrinkAllColumns(true);
           sudokuGrid.setStretchAllColumns(true);

           TableRow.LayoutParams paramsRow = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
           TableLayout.LayoutParams paramsLayout = new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT);

           for(int i = 0; i < 9; ++i)
           {
               TableRow tableRow = new TableRow(SolverActivity.this);
               tableRow.setDividerDrawable(getResources().getDrawable(R.drawable.column_divider));
               tableRow.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
               for(int j = 0; j < 9; ++j)
               {
                   View cell = getLayoutInflater().inflate(R.layout.cell_layout, sudokuGrid, false);
                   cell.setLayoutParams(paramsRow);
                   tableRow.addView(cell);
               }

               tableRow.setLayoutParams(paramsLayout);
               sudokuGrid.addView(tableRow);
        }
    };
    if (savedInstanceState == null) {
        AsyncLayoutInflater inflater = new AsyncLayoutInflater(this);
        inflater.inflate(R.layout.solver_principal, null, callback);
    } else {
        View view = getLayoutInflater().inflate(R.layout.solver_principal, null);
        Callback.onInflateFinished(view, R.layout.solver_principal, null)
    }
}

(3) Интенсивность инфляции (чтение из хранилища, анализ XML, проверка ошибок, выделение ресурсов, память ...)

Вывообще не нужно надувать, делайте это программно.

Как не для надувания

(a) SO Должен ли я надувать макет или программно его создавать?

(b) Вот подход, который я предпочитаю (небольшие исходные файлы .java проекта 4, основанные на ImageView с OnCellTouchListener), которые вы можете изменить: android-calendar-view

enter image description here

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