Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

211
Vistas
Recopilación de flujos en ViewModel. ¿Se necesita repeatOnLifeCycle?

Hasta ahora solía recopilar mis flujos en actividad/fragmento o en ViewModel así

Actividad/Fragmento

 lifecycleScope.launch { myViewModel.readTokenCredentials().collect { data -> /* do something */ } }

Ver modelo

 viewModelScope.launch { prefsRepo.readTokenCredentials().collect { data -> /* do something */ } }

Ahora, los desarrolladores de Google nos dicen que esta no es una forma segura de recopilar flujos porque podría provocar pérdidas de memoria. En su lugar, recomiendan envolver la colección en lifecycle.repeatOnLifecycle para la colección de flujo en Actividades/Fragmentos.

 lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { myViewModel.readTokenCredentials().collect { data -> /* do something */ } } }

Mi pregunta es:

¿Por qué no puedo usar repeatOnLifecycle con viewModelScope al recopilar flujos dentro del modelo de vista? Por supuesto, sé que el modelo de vista no tiene en cuenta el ciclo de vida, pero ¿es quizás menos probable que viewModelScope introduzca pérdidas de memoria durante la recopilación de flujo?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

No es posible tener una repetición en el ciclo de vida ya que ViewModel no tiene un ciclo de vida repetitivo. Comienza una vez y se destruye una vez.

No creo que la fuga de memoria sea un término preciso para lo que sucede cuando se continúa recopilando un flujo mientras un fragmento está fuera de la pantalla. Solo está causando que su flujo ascendente siga emitiendo sin motivo, pero los elementos emitidos se recolectarán como basura. Es simplemente un desperdicio de actividad. El peligro surge si también está actualizando la interfaz de usuario en el recopilador, ya que puede actualizar accidentalmente las vistas que están fuera de la pantalla.

En un ViewModel, tiene el mismo riesgo de recopilar de Flows sin ningún motivo. Para evitarlo, puede usar stateIn o shareIn con un valor WhileSubscribed . Entonces dejará de recolectar cuando no haya nada recolectando aguas abajo. Y si está utilizando repeatOnLifecycle en sus actividades y fragmentos que se recopilan de estos SharedFlows y StateFlows, entonces todo está solucionado.

Por ejemplo:

 val someFlow = prefsRepo.readTokenCredentials() .map { data -> // doSomething } .shareIn(viewModelScope, SharingStarted.WhileSubscribed(5000L), 1)

Y recójalo en la capa de la interfaz de usuario. Si no hay nada que recopilar la interfaz de usuario, entonces, ¿por qué existe el flujo en primer lugar? No puedo pensar en un buen contraejemplo. ViewModel está diseñado para preparar el modelo para verlo, no para hacer un trabajo que nunca se ha visto.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda