私は、81セルのそれぞれがそれ自体が3x3グリッドである9x9数独グリッドを作成しています。単一のセルは次のようになります。
1 2 3
4 5 6
7 8 9
各番号は、そのセルの鉛筆注釈を表します。この3x3配置を表すcell_layout.xmlというファイルがあります。
私はすでにグリッドを生成することができ、コードは機能します:
@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に膨張させます。
動作するので、問題は何ですか?
アクティビティを作成するには時間がかかりすぎます。グリッドの1行だけでテストしても、メソッドが必要なレイアウトの何倍にも膨らむには時間がかかりすぎます。
私は得ます:
バックグラウンド同時コピーGCによって解放された131244(9MB)AllocSpaceオブジェクト、0(0B) LOSオブジェクト、24%空き、74MB/98MB、一時停止127us合計444.411ms
153フレームをスキップしました!アプリケーションがメインスレッドで実行している作業が多すぎる可能性があります。
誰かが私の状況にもっと良いアプローチを提案できますか? 3x3グリッドを81倍生成する作業は本当に多すぎますか?
ありがとう
編集
そこで、手動で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>
より一般的なアプローチ(より多くのユーザーに役立つ)、に関係なく
RecyclerView
とGridLayoutManager
を使用したグリッドの例(古いGridViewのように) 、main thread
は何をしますか(多くのことを行いますが、オーバーロードしないでください!)?
Androidアプリケーションの起動時に常に作成されるデフォルトのプライマリスレッド。
UI
スレッドとも呼ばれます。特に指定のない限り、すべての
user interface
およびactivities
の処理を担当します。
Runnable
は、スレッド間でのコードの共有を処理することを目的としたinterface
です。これには、run()という1つのメソッドしか含まれていません。
「Google検索結果」、「ウェブからの注目スニペット」から
メインスレッドで大きな複雑な TableLayout を膨らませるのはinsane!
(1)ワーカー(バックグラウンド)スレッドを使用 プロセスとスレッド
Androidのスレッドモデルには2つの単純なルールがあります。
UI
スレッドの外部からAndroid UI toolkit
にアクセスしないでください(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)ここに私が好むアプローチがあります(ImageView
とOnCellTouchListener
に基づく小さなプロジェクト4ソース.Javaファイル)。これは変更できます: Android-calendar-view