1

我正在构建一个数独游戏,但我在这里遇到了性能问题。

我有这个网格,我想用 81 个单元格填充网格。这些单元格是自定义视图,因为我希望它们中有 10 个标签以及一些功能 blabla。

我现在的问题是我必须创建 81 个子视图(没问题),用我的模型中的数据填充它们(没问题),然后将整个网格添加到我的布局中(biiiig 问题)。

整个建筑是在这样的异步任务中完成的:

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) 非常慢。

有人可以帮我如何保持我的主线程快速吗?

4

2 回答 2

1

我相信问题在于您要在视图中添加大量的TableLayout。它必须遍历每一个单元格以使其适合布局measurelayout

您可以做的一件事是创建单TableLayout输入onPreExecute并将其添加到布局中。然后,您可以创建每个面板并将其添加到TableLayout正在制作的面板中。这将在单个单元格上完成所有布局内容,而不是在一个大块中完成所有布局。

我想指出可能或可能不相关的一件事是您TableLayout在后台线程中创建了一个。众所周知,在后台线程中膨胀视图会导致某些设备出现问题。 你没有膨胀。你正在创建一个View对象,所以它很可能是不一样的,但我想没有保证。因此,我可能会使用后台线程来创建和收集每个单元格的数据,然后创建并添加在onProgressUpdateUI 线程上运行的单元格。

于 2012-09-25T15:23:15.910 回答
0

我发现与 tablerows 结合使用的 tablelayout 非常慢。我尝试使用 Horizo​​ntal 和 VerticalLinearlayouts,这将生成视图的速度至少提高了 300%。

感谢所有新提示。以后我会考虑的!

于 2012-09-26T11:43:34.603 回答