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.

flowWithLifecycle(lifecycle, Lifecycle.State.STARTED) no detiene los flujos mientras la aplicación está en segundo plano.

Intento observar el resultado de la “Vista de la colección y flujos ascendentes detenidos”. Pero “viewModel.testFlow” aún está recolectando mientras la aplicación está en segundo plano.
¿Por qué no puedo observar que la recolección está detenida? ¿Estoy observando algo mal?

ViewModel:

val testFlow = flow<int> {
    for (i in 1..100) {
        delay(1000)
        Timber.e("testFlow: EMIT = $i")
        emit(i)
    }
}

Activity:

override fun onViewCreated() {
    lifecycleScope.launch {
        viewModel.testFlow
            .flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
            .collect {
                Timber.d("testFlow: $it Collected")
            }
    }
}

override fun onActivityPaused(activity: Activity) {
    super.onActivityPaused(activity)
    Timber.e("testFlow: onActivityPaused")
}

Logs
Diagrama de ciclo de vida

Artículo de Medium

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual no puedes observar la colección detenida es porque estás utilizando el operador flowWithLifecycle para recolectar desde el flujo. Este operador solo detiene la recolección cuando el estado del ciclo de vida cambia a DESTROYED. En tu caso, solo estás cambiando el estado a STARTED cuando se crea la vista, lo cual significa que la colección no se detendrá cuando la actividad se pausa o está en segundo plano.

    Para observar la colección detenida cuando la aplicación está en segundo plano, puedes utilizar el operador repeatOnLifecycle en lugar de flowWithLifecycle. Este operador reinicia la colección cuando el estado del ciclo de vida cambia a STARTED y la detiene cuando el estado cambia a STOPPED. Esto asegura que la colección se detenga cuando la aplicación está en segundo plano. Aquí tienes un ejemplo:

    lifecycleScope.launch {
        repeatOnLifecycle(Lifecycle.State.STARTED) {
            viewModel.testFlow.collect {
                Timber.d("testFlow: $it recolectado")
            }
        }
    }
    

    Además, asegúrate de importar el operador repeatOnLifecycle desde la biblioteca lifecycle-runtime-ktx.

    import androidx.lifecycle.repeatOnLifecycle
    

Comments are closed.