Desarrollé una aplicación para mostrar texto a intervalos definidos en la pantalla del emulador de Android. Estoy usando la Handlerclase Aquí hay un fragmento de mi código:
handler = new Handler();
Runnable r = new Runnable() {
    public void run() {
        tv.append("Hello World");               
    }
};
handler.postDelayed(r, 1000);
Cuando ejecuto esta aplicación, el texto se muestra solo una vez. ¿Por qué?
                    
                        android
                                multithreading
                                
                    
                    
                        Rajapandian
fuente
                
                fuente

Respuestas:
La solución simple a su ejemplo es:
O podemos usar hilo normal, por ejemplo (con Runner original):
Puede considerar su objeto ejecutable solo como un comando que se puede enviar a la cola de mensajes para su ejecución, y el controlador como solo un objeto auxiliar utilizado para enviar ese comando.
Más detalles están aquí http://developer.android.com/reference/android/os/Handler.html
fuente
fuente
Creo que puede mejorar la primera solución de Alex2k8 para la actualización correcta cada segundo
1.código original:
2.Análisis
tv.append("Hello Word")costo T milisegundos, después de mostrar 500 veces el tiempo de retraso es 500 * T milisegundos3. Solución
Para evitar eso Simplemente cambie el orden de postDelayed (), para evitar retrasos:
fuente
Para repetir la tarea, puede usar
llámalo como
Dónde
tarea siendo el método a ejecutar
después del tiempo de ejecución inicial
( Intervalo de tiempo para repetir la ejecución)
En segundo lugar
Y también puede usar CountDownTimer si desea ejecutar una Tarea varias veces.
Y también puedes hacerlo con runnable. crear un método ejecutable como
Y llámalo de ambas maneras
O
fuente
Creo que para este caso típico, es decir, ejecutar algo con un intervalo fijo,
Timeres más apropiado. Aquí hay un ejemplo simple:Usar
Timertiene pocas ventajas:scheduleargumentos de la funciónmyTimer.cancel()myTimer.cancel()antes de programar uno nuevo (si myTimer no es nulo)fuente
fuente
rque está definida todavía.Si entiendo correctamente la documentación del método Handler.post ():
Entonces, los ejemplos proporcionados por @ alex2k8, aunque funcionan correctamente, no son los mismos. En caso de que
Handler.post()se use, no se crean nuevos hilos . Simplemente publicaRunnableen el hiloHandlerpara que EDT lo ejecute . Después de eso, EDT solo se ejecutaRunnable.run(), nada más.Recuerde:
Runnable != Thread.fuente
Kotlin
Java
fuente
Un ejemplo interesante es que puedes ver continuamente un contador / cronómetro corriendo en un hilo separado. También muestra la ubicación GPS. Mientras que la actividad principal User Thread ya está allí.
Extracto:
Para ver el código ver aquí:
Ejemplo de subproceso que muestra la ubicación GPS y la hora actual ejecutables junto con el subproceso de interfaz de usuario de la actividad principal
fuente
ahora en Kotlin puedes ejecutar hilos de esta manera:
fuente
Kotlin con corutinas
En Kotlin, usando corutinas puede hacer lo siguiente:
Pruébalo aquí !
fuente