程序运行时如何让GUI更新?

时间:2012-06-21 15:51:23

标签: java android multithreading user-interface

我试图在循环的每次迭代后更新GUI。我已经阅读了类似问题的其他答案,仍然无法使其发挥作用。在下面的代码中,我调用simulate,它运行循环调用步骤,根据需要计算和更改GUI组件,但GUI直到循环完全结束后才更新。如何在每次迭代后更新它?

public void step(View v) {
    for (int i = 0; i < cells.length; i++)
        update(i);

    count++;

    Toast.makeText(getApplicationContext(), count + "", 1000).show();
}

public void simulate(View v) {
    while (!pause) {
        step(v);

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public void update(final int i)
{
            //This goes through each button and counts the neighbors (this is the 
            //intensive work
    int neighbors = getNeighbors(i);

            //With the information provided from the getNeighbors the following if
            //statement updates the GUI using the dead and alive method calls.
    if (isAlive(cells[i])) {
        if (neighbors < 2)
            dead(cells[i]);
        else if (neighbors > 3)
            dead(cells[i]);
    } 
    else {
        if (neighbors == 3)
            alive(cells[i]);
    }
}

3 个答案:

答案 0 :(得分:1)

问题是您在应用程序的主线程中运行该代码。 GUI在同一个线程上运行,并且在阻止它时无法更新。

您必须在其他任务中执行计算,然后向主进程发送消息以更新GUI。 阅读本文以获取背景信息(如果您是新手,请先阅读背景信息):

http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html

最简单的方法是使用AsyncTask,然后使用“onProgressUpdate()”进行GUI更新。 尽管AsyncTask已经使事情变得非常简单,但您必须注意在AsyncTask运行时可能会破坏底层活动。这在文档中并没有真正涵盖,但我发现使用Fragments可能是处理它的最佳方法。阅读这篇文章以获得一个非常好的描述:

http://blogactivity.wordpress.com/2011/09/01/proper-use-of-asynctask/

备注:另请阅读AsyncTask文档。由于论坛的限制,我无法发布链接。

答案 1 :(得分:0)

我认为你必须使用AsyncTask。

尝试阅读文档..

http://developer.android.com/reference/android/os/AsyncTask.html

答案 2 :(得分:0)

我们始终建议, UI工作应该在UI-Thread上,非UI工作在非UI线程上,但是从HoneyComb android版本它变成了一个LAW When we start an application in Android, it start on the Dedicated UI thread, creating any other thread will drop you off the UI thread, you normally do this to do some process intensive work, but when you want to display the output of the non-ui thread process, on the ui thread then you will experience lagging, exception etc...

从我看来,这可以用two方式完成....

  1. 使用处理程序 ... Handler stores the reference of the thread on which it was created, Initialize Handler inside the onCreate() method, and then use handler.post( ) to update the UI thread.

  2. 使用android提供的 AsyncTask&lt;&gt; ,它会同步UI和非UI线程

    AsyncTask中的方法&lt;&gt;

    doInBackground(String...) // Work on the Non-UI thread

    postExecute(String result) // Getting the Output from the Non-Ui thread and

    Putting the Output back on the UI Thread