¿Cómo ejecutar un hilo Runnable en Android a intervalos definidos?
Desarrollé una aplicación para mostrar texto a intervalos definidos en la pantalla del emulador de Android. Estoy usando la Handler
clase. 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é?
La solución simple a su ejemplo es:
handler = new Handler();
final Runnable r = new Runnable() {
public void run() {
tv.append("Hello World");
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(r, 1000);
O podemos usar un hilo normal, por ejemplo (con Runner original):
Thread thread = new Thread() {
@Override
public void run() {
try {
while(true) {
sleep(1000);
handler.post(this);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
Puede considerar su objeto ejecutable simplemente como un comando que se puede enviar a la cola de mensajes para su ejecución, y el controlador como simplemente un objeto auxiliar utilizado para enviar ese comando.
Más detalles están aquí http://developer.android.com/reference/android/os/Handler.html
new Handler().postDelayed(new Runnable() {
public void run() {
// do something...
}
}, 100);
Creo que puedo mejorar la primera solución de Alex2k8 para que la actualización sea correcta cada segundo.
1.Código original:
public void run() {
tv.append("Hello World");
handler.postDelayed(this, 1000);
}
2.Análisis
- En el costo anterior, suponga que
tv.append("Hello Word")
el costo es T milisegundos, después de mostrar 500 veces el tiempo de retraso es 500*T milisegundos - Aumentará el retraso cuando se ejecute durante mucho tiempo.
3. Solución
Para evitar eso, simplemente cambie el orden de postDelayed(), para evitar retrasos:
public void run() {
handler.postDelayed(this, 1000);
tv.append("Hello World");
}