Android更新Thread和Runnable中的TextView

我想在Android中做一个简单的定时器,每秒更新一次TextView。 它只是像扫雷一样计算秒数。

问题是当我忽略tvTime.setText(…)(使其成为//tvTime.setText(…),LogCat中将每秒打印下面的数字。但是当我想要设置此数字为TextView(在另一个线程中创build),程序崩溃。

有没有人有一个想法如何轻松解决这个问题?

这是代码(在启动时调用方法):

private void startTimerThread() { Thread th = new Thread(new Runnable() { private long startTime = System.currentTimeMillis(); public void run() { while (gameState == GameState.Playing) { System.out.println((System.currentTimeMillis() - this.startTime) / 1000); tvTime.setText("" + ((System.currentTimeMillis() - this.startTime) / 1000)); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); th.start(); } 

编辑:

最后,我明白了。 这是对那些感兴趣的人的解决scheme。

 private void startTimerThread() { Thread th = new Thread(new Runnable() { private long startTime = System.currentTimeMillis(); public void run() { while (gameState == GameState.Playing) { runOnUiThread(new Runnable() { @Override public void run() { tvTime.setText(""+((System.currentTimeMillis()-startTime)/1000)); } }); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); th.start(); } 

UserInterface只能由UI线程更新。 您需要一个处理程序 ,发布到UI线程:

 private void startTimerThread() { Handler handler = new Handler(); Runnable runnable = new Runnable() { private long startTime = System.currentTimeMillis(); public void run() { while (gameState == GameState.Playing) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } handler.post(new Runnable(){ public void run() { tvTime.setText("" + ((System.currentTimeMillis() - this.startTime) / 1000)); } }); } } }; new Thread(runnable).start(); } 

或者,您也可以在线程中随时更新UI元素:

 runOnUiThread(new Runnable() { public void run() { // Update UI elements } }); 

您无法从非UI线程访问UI元素。 尝试使用另一个Runnable围绕对setText(...)的调用,然后查看View.post(Runnable)方法。

作为选项,使用runOnUiThread()更改主线程中的de视图属性。

  runOnUiThread(new Runnable() { @Override public void run() { textView.setText("Stackoverflow is cool!"); } });