Actualización de Android TextView en subprocesos y ejecución

Quiero hacer un temporizador simple en Android que actualiza un TextView cada segundo. Simplemente cuenta segundos como en Minesweeper.

El problema es cuando ignoro el tvTime.setText (…) (hágale //tvTime.setText (…), en LogCat se imprimirá el número siguiente cada segundo. Pero cuando quiero fijar este número a un TextView (creado en otro hilo), el programa se bloquea.

¿Alguien tiene una idea de cómo resolver esto fácilmente?

Aquí está el código (el método se llama al inicio):

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(); } 

EDITAR:

Finalmente lo tengo. Aquí está la solución, para aquellos que estén interesados ​​en.

 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(); } 

El UserInterface sólo puede actualizarse mediante el subproceso UI. Necesitas un manejador , para publicar en la interfaz de usuario Tema:

 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(); } 

Como alternativa, también puede hacer esto en el subproceso cada vez que desee actualizar un elemento de interfaz de usuario:

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

No puede acceder a elementos de la interfaz de usuario desde subprocesos que no sean de interfaz de usuario. Intente rodear la llamada a setText(...) con otro Runnable y luego mire en el View.post(Runnable) .

Como opción use runOnUiThread () para cambiar las propiedades de views en el thread principal.

  runOnUiThread(new Runnable() { @Override public void run() { textView.setText("Stackoverflow is cool!"); } }); 
  • Extra padding en TextView con contenido HTML
  • Nuevo Texto Seleccionable en el componente android 3 (API <= 11)
  • Android Fuente personalizada Spannable Tipo de letra
  • Puedo cambiar el aspecto y la sensación de la clickablespan
  • Android: ¿Cómo determinar el índice de caracteres de la posición de un evento táctil en TextView?
  • Texto de Android alrededor de error de imagen
  • Android: selector de texto personalizado
  • Esquina redondeada para texto en android
  • El helado de helado de elipse añade [
  • Uso de varios colores de texto en la vista de texto de Android
  • Etiqueta vertical (girada) en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.