0

我试图在每次循环迭代后更新 GUI。我已经阅读了类似问题的其他答案,但仍然无法正常工作。在下面的代码中,我调用了模拟,它通过循环调用步骤运行,该步骤根据需要计算和更改 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]);
    }
}
4

3 回答 3

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 文档。由于论坛的限制,我无法发布链接。

于 2012-06-21T16:45:36.250 回答
0

我认为您必须为此使用 AsyncTask 。

尝试阅读文档..

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

于 2012-06-21T15:54:43.610 回答
0

我们总是被告知,UI 工作应该在 UI-Thread 上,Non-UI 工作在 Non-UI Thread 上,但是从 HoneyComb android 版本开始它变成了一个 LAWWhen 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 ... 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<>,同步UI和Non-UI线程

    AsyncTask<> 中的方法

    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

于 2012-06-21T17:23:09.513 回答