Android:在单独的线程中将多个子项添加到布局中

时间:2013-04-10 07:14:00

标签: android multithreading layout children

我有一个带有Button和GridLayout的活动,有很多孩子。如果我在onCreate()中添加所有这些孩子,我的活动会出现在一个滞后的屏幕上:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout main = new LinearLayout(this);
    main.setOrientation(LinearLayout.VERTICAL);

    Button button = new Button(this);
    button.setText("test");
    main.addView(button);

    GridLayout testGrid = new GridLayout(this);
    testGrid.setColumnCount(5);
    for (int i = 0; i < 100; i++)
        testGrid.addView(new Button(this));
    main.addView(testGrid);

    setContentView(main);
}

但我希望至少我的Buttton立刻出现,所以我尝试将一个子项添加到一个线程的网格中。经过实验,我得出了这个解决方案:

    final GridLayout testGrid = new GridLayout(this);
    testGrid.setColumnCount(5);
    main.addView(testGrid);
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {
            new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 100; i++)
                        MyActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                testGrid.addView(new Button(testGrid.getContext()));
                            }
                        });
                }
            }).start();
        }
    }, 1);

但我不确定这是个好主意,因为它看起来有点复杂,可能会在某些设备上运行良好。还有更好的建议吗?

1 个答案:

答案 0 :(得分:1)

当你必须做这样的事情时,这清楚地表明你做错了什么。如果你真的需要网格中的100个按钮,也许你应该考虑使用GridView而不是GridLayout,并通过一个简单的适配器将按钮加载到视图中。