Una llamada de red en tu app Android sigue corriendo después de cerrar la pantalla y a veces crashea al actualizar una UI que ya no existe. ¿Cómo lo resuelves?
Contexto
Corrutinas lanzadas con GlobalScope o un scope propio sin cancelar, resultados que llegan tarde y tocan la vista, y fugas de memoria al rotar el dispositivo. El equipo usa Kotlin con coroutines.
Respuesta modelo
El problema es no atar la corrutina al ciclo de vida. 1) Lanzar el trabajo en viewModelScope (en el ViewModel) o lifecycleScope, que se cancelan solos cuando el ViewModel o la vista se destruyen. Nunca GlobalScope para trabajo ligado a UI. 2) Para colectar flujos de forma segura, usar repeatOnLifecycle(STARTED) o flowWithLifecycle, de modo que la colección se detenga cuando la pantalla no está visible. 3) Exponer el estado como StateFlow desde el ViewModel; la UI lo observa y sobrevive a la rotación porque el ViewModel persiste. 4) Elegir el dispatcher correcto (Dispatchers.IO para red/disco) y volver al main solo para actualizar estado. 5) La cancelación estructurada garantiza que al cerrar la pantalla no queden corrutinas huérfanas.
Claves
- viewModelScope/lifecycleScope se cancelan con el ciclo de vida.
- repeatOnLifecycle detiene la colección cuando la UI no es visible.
- El ViewModel + StateFlow sobreviven a la rotación.