我试图在循环的每次迭代后更新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]);
}
}
答案 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)
答案 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
方式完成....
使用处理程序 ... 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.
使用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