es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Una acción en bucle cada 15 segundos comienza bien, pero últimamente se ejecuta cada segundo.

Tengo un bucle en mi MainActivity.java:

public class MainActivity <…> {
Handler handler = new Handler();
Runnable runnable;
int delay = 15000;
}

@Override
public void onResume() {
//super.onResume();

handler.postDelayed(runnable = new Runnable() {
    public void run() {
        handler.postDelayed(runnable, delay);
        Log.d("myTag", "Este es mi mensaje");
    }
}, delay);
super.onResume();

}

Como se dijo al principio, la acción se ejecuta cada 15 segundos (no es exacto, a veces 13, a veces 16, etc., pero sigue ejecutándose) hasta que en algún momento comienza a ejecutarse cada segundo:

Últimas entradas del Logcat:

2021-12-08 18:06:35.329 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje
2021-12-08 18:06:38.135 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje
2021-12-08 18:06:39.318 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje
2021-12-08 18:06:39.667 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje
2021-12-08 18:06:48.967 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje
2021-12-08 18:06:50.330 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje
2021-12-08 18:06:53.138 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje
2021-12-08 18:06:54.320 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje
2021-12-08 18:06:54.669 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje
2021-12-08 18:07:03.968 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje
2021-12-08 18:07:05.332 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje
2021-12-08 18:07:08.140 25533-25533/com.app.xxxx D/myTag: Este es mi mensaje

¿Alguna idea? ¿Por qué está sucediendo esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El fragmento de código proporcionado crea un bucle que se ejecuta cada 15 segundos utilizando un controlador para enviar un Runnable retrasado. Sin embargo, el logcat muestra que en algún momento, el bucle comienza a ejecutarse cada segundo.

    Una posible razón para este comportamiento es que el método onResume() se llama varias veces, lo que resulta en múltiples instancias del bucle que se ejecutan simultáneamente. Esto puede ocurrir si la actividad se pausa y se reanuda con frecuencia, lo que hace que cada instancia del bucle agregue su propio Runnable retrasado a la cola del controlador.

    Para solucionar este problema, podemos verificar si el runnable ya está agregado a la cola del controlador antes de agregarlo nuevamente. Esto se puede hacer estableciendo un indicador para indicar si el controlador ya está ejecutando el runnable, y verificando este indicador antes de enviar el runnable nuevamente.

    Aquí tienes un fragmento de código actualizado con esta modificación:

    public class MainActivity ... {
        Handler handler = new Handler();
        Runnable runnable;
        int delay = 15000;
        boolean isHandlerRunning = false;
    }
    
    @Override
    public void onResume() {
        super.onResume();
    
        if (!isHandlerRunning) {
            handler.postDelayed(runnable = new Runnable() {
                public void run() {
                    isHandlerRunning = true;
                    handler.postDelayed(runnable, delay);
    
                    Log.d("myTag", "Este es mi mensaje");
    
                    // Restablecer el indicador para que el controlador pueda ejecutar el runnable nuevamente
                    isHandlerRunning = false;
                }
            }, delay);
        }
    }
    

    Al verificar el indicador isHandlerRunning antes de enviar el runnable nuevamente, nos aseguramos de que solo se esté ejecutando una instancia del bucle en cualquier momento dado, lo que evita que el bucle se ejecute cada segundo.

Comments are closed.