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.

repeatOnLifecycle en Android dentro de un fragmento dentro de ViewPager2

Si agrego el siguiente fragmento de código a un fragmento “normal”, se inicia y se cancela como se espera al navegar hacia y desde el fragmento, pero si lo agrego a un fragmento dentro de un View Pager 2 no se cancela incluso cuando se invoca el método onPause de los fragmentos. ¿Esto es intencional o me estoy perdiendo algo?

lifecycleScope.launch {
    viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
        try {
            while (isActive) {
                println("Fragmento vivo....")
                delay(1000)
            }
        } catch (ex: CancellationException) {
            println("Fragmento cancelado...")
            throw ex
        }
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Es intencional que el fragmento de código añadido a un fragmento dentro de un ViewPager2 no se cancele aunque se invoque el método onPause del fragmento. Esto se debe a que ViewPager2 mantiene las páginas adyacentes en un estado reanudado, incluso cuando no son visibles para el usuario. Por lo tanto, el método viewLifecycleOwner.repeatOnLifecycle() devuelve el estado STARTED incluso cuando el fragmento no es visible. Para solucionar este problema, puedes añadir una comprobación dentro del bucle while para ver si el fragmento sigue siendo visible o utilizar ViewPager2.OnPageChangeCallback para detectar cuándo el fragmento se vuelve visible y añadir o eliminar la tarea de la coroutine en consecuencia.

Comments are closed.