自定义视图很慢

时间:2012-09-25 15:02:57

标签: android android-layout android-custom-view

我正在构建一个数独游戏,我正面临一个性能问题。

我有这个网格,我想用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)超级低。

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

2 个答案:

答案 0 :(得分:1)

我认为问题是你在视图中添加大量 TableLayout。它必须通过measurelayout遍历每个单元格以使其适合布局。

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

我想指出的一点是,或许可能没有关系,你在后台线程中创建了一个TableLayoutInflating Views in a background thread has been known to cause problems on some devices.你没有膨胀。你正在创建一个View对象,因此它很可能不一样,但我想没有gaurantee。因此,我可能会使用后台线程来创建和收集每个单元格的数据,然后创建并添加在UI线程上运行的onProgressUpdate中的单元格。

答案 1 :(得分:0)

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

感谢所有新提示。我将来会考虑它们!