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.
- Indentación de Android y sangría de sangría
- Cómo configurar la cadena de respuesta JSON formateada en un TextView?
- Cómo hacer una vista de seguir a mi dedo con onScroll y GestureDetector - Android
- Actualizar Textview desde la función Android
- TextView ClickableSpan estilo para estado pulsado
¿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(); }
- ¿Cómo hace un Android EditText (TextView) dibujar el cursor parpadeante?
- Altura dinámica de TextView dentro de un GridLayout
- Nuevo carácter de línea \ n no se muestra correctamente en textView Android
- XAMARIN (C #) - ¿Hay una manera de subrayar un TextView mediante programación?
- ¿Puedo deshabilitar el desplazamiento en TextView cuando se utiliza LinkMovementMethod?
- ¿Cómo puedo detectar un clic en el título de ActionBar?
- Tener un problema al eliminar TextViews de un LinearLayout mediante programación
- Cómo influenciar linebreak en Android Textview
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!"); } });
- El dispositivo de detección para depuración (ADB) no funciona
- ¿Es el proveedor de contenido una implementación del patrón del repositorio?