Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

213
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda