¿Cómo ejecutar un hilo Runnable en Android a intervalos definidos?

Resuelto Rajapandian asked hace 54 años • 11 respuestas

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é?

Rajapandian avatar Jan 01 '70 08:01 Rajapandian
Aceptado

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

alex2k8 avatar Dec 17 '2009 13:12 alex2k8
new Handler().postDelayed(new Runnable() {
    public void run() {
        // do something...              
    }
}, 100);
user2212515 avatar Jul 21 '2014 03:07 user2212515

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");
}
NguyenDat avatar Jul 23 '2011 11:07 NguyenDat