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

357
Vistas
¿Cómo finalizar/cerrar un MutableSharedFlow?

SharedFlow acaba de ser introducido en coroutines 1.4.0-M1, y está destinado a reemplazar todas las implementaciones de BroadcastChannel (como se indica en la descripción del problema de diseño ).

Tengo un caso de uso en el que uso un BroadcastChannel para representar marcos de socket web entrantes, de modo que varios oyentes puedan "suscribirse" a los marcos. El problema que tengo cuando me muevo a SharedFlow es que no puedo "finalizar" el flujo cuando recibo un cuadro cerrado o un error ascendente (que me gustaría hacer para informar a todos los suscriptores que el flujo ha terminado).

¿Cómo puedo hacer que todas las suscripciones finalicen cuando quiero "cerrar" SharedFlow de manera efectiva? ¿Hay alguna manera de saber la diferencia entre el cierre normal y el cierre con excepción? (como canales)

Si MutableSharedFlow no permite transmitir el final del flujo a los suscriptores, ¿cuál es la alternativa si BroadcastChannel queda obsoleto/eliminado?

over 4 years ago · Hanz Gallego
2 Respuestas
Responde la pregunta

0

La documentación SharedFlow describe lo que necesita:

Tenga en cuenta que la mayoría de los operadores de terminal, como Flow.toList, tampoco se completarían cuando se aplicaran a un flujo compartido, pero los operadores de truncamiento de flujo como Flow.take y Flow.takeWhile se pueden usar en un flujo compartido para convertirlo en uno de finalización.

SharedFlow no se puede cerrar como BroadcastChannel y nunca puede representar una falla. Todos los errores y señales de finalización deben materializarse explícitamente si es necesario.

Básicamente, deberá introducir un objeto especial que pueda emitir desde el flujo compartido para indicar que el flujo ha finalizado, utilizando takeWhile en el extremo del consumidor puede hacer que emitan hasta que se reciba ese objeto especial.

over 4 years ago · Hanz Gallego Denunciar

0

Creo que una posible solución es crear un indicador booleano isValid y exponer públicamente solo los flujos con .takeWhile { isValid } . Luego simplemente llame a isValid = false y sFlow.emit() cuando desee cerrar todos los suscriptores.

Posible implementación:

 private var isValid = true // In real scenario use atomic boolean private val _sharedFlow = MutableSharedFlow<Unit>() val sharedFlow: Flow<Unit> get() = _sharedFlow.takeWhile { isValid } suspend fun cancelSharedFlow() { isValid = false _sharedFlow.emit(Unit) }

EDITAR: En mi caso .emit() siempre se suspendía, así que tuve que usar BufferOverflow.DROP_LATEST (que no es adecuado para muchos casos de uso). No estoy seguro si el problema está en este ejemplo o en otra parte de mi aplicación. Si ves un problema, por favor comenta :)

over 4 years ago · Hanz Gallego 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