我正在构建一个数独游戏,我正面临一个性能问题。
我有这个网格,我想用81个单元填充网格。 这些单元格是自定义视图,因为我希望它们中包含10个标签和一些函数blabla。
我现在的问题是我必须创建81个子视图(没问题),用模型中的数据填充它们(没问题)然后将整个网格添加到我的布局(biiiig问题)。
整个建筑都是在这样的asynctask中完成的:
protected Void doInBackground(Void... params) {
Model.Cell[][] sudoku = Controller.getInstance().startNewGame(); //call model for a new game
ArrayList<TableRow> rows = ga.generateTable(sudoku); //generate the table
tl = new TableLayout(ga); //create tablelayout
//add the rows to the layout
for (TableRow v : rows) {
tl.addView(v);
}
return null;
}
然后完成此操作:
protected void onPostExecute(Void result) {
super.onPostExecute(result);
RelativeLayout rl = (RelativeLayout) ga.findViewById(R.id.gridContainer); //get the container
//create layout rules
android.widget.RelativeLayout.LayoutParams params = new android.widget.RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.CENTER_HORIZONTAL);
//add the table to the container with the layout
rl.addView(tl, params); //this is slow as hell.
//stop loading indicator
this.loading.dismiss();
}
我不介意加载吧一段时间。但我的加载栏正在停止,因为rl.addView(tl,params)超级低。
有人可以帮助我如何保持主线程快速吗?
答案 0 :(得分:1)
我认为问题是你在视图中添加大量 TableLayout。它必须通过measure
和layout
遍历每个单元格以使其适合布局。
您可以做的一件事是在TableLayout
中创建单个onPreExecute
并将其添加到布局中。然后,您可以创建每个面板,并在制作时将其添加到TableLayout
。这将完成单个单元格上的所有布局内容,而不是一个大块中的所有布局内容。
我想指出的一点是,或许可能没有关系,你在后台线程中创建了一个TableLayout
。 Inflating Views in a background thread has been known to cause problems on some devices.你没有膨胀。你正在创建一个View
对象,因此它很可能不一样,但我想没有gaurantee。因此,我可能会使用后台线程来创建和收集每个单元格的数据,然后创建并添加在UI线程上运行的onProgressUpdate
中的单元格。
答案 1 :(得分:0)
我发现与tablerow结合使用的tablelayout非常慢。 我尝试使用Horizontal和VerticalLinearlayouts,这至少将生成视图的速度提高了300%。
感谢所有新提示。我将来会考虑它们!