Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

214
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!