es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

StateFlowImpl collect tiene un ciclo while. Si lo uso en el hilo de la interfaz de usuario, ¿por qué no bloquea el hilo de la interfaz de usuario?

Si uso un bucle while en el inicio, seguirá ejecutándose, el evento de clic no se ejecutará y eventualmente llevará a ANR.
StateFlowImpl collect tiene un bucle while. ¿Cuándo saldrá del bucle? Este es mi caso:

class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {
    private val TAG = "MainActivity"
    val flow = MutableStateFlow(0)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        launch {
            while (true) {
                Log.d(TAG, "while")
            }
        }
        launch {
            flow.collect {
                Log.d(TAG, "onCreate: $it")
            }
        }
    }
}

// Esta es StateFlowImpl
override suspend fun collect(collector: FlowCollector<T>) {
    val slot = allocateSlot()
    try {
        if (collector is SubscribedFlowCollector) collector.onSubscription()
        val collectorJob = currentCoroutineContext()[Job]
        var oldState: Any? = null // previamente emitido T !! | NULL (null - todavía no se emitió nada)
        while (true) {
            val newState = _state.value
            collectorJob?.ensureActive()
            if (oldState == null || oldState != newState) {
                collector.emit(NULL.unbox(newState))
                oldState = newState
            }
            if (!slot.takePending()) {
                slot.awaitPending()
            }
        }
    } finally {
        freeSlot(slot)
    }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    El bucle while en la función de recolección de StateFlowImpl saldrá sólo cuando el recolector haya sido cancelado o el flujo recolectado haya sido completado. Entonces, en su caso, el bucle while seguirá corriendo hasta que la actividad sea destruida y el recolector sea cancelado, o el objeto StateFlow no esté emitiendo datos y el flujo recolectado sea completado. Por lo tanto, si usa un bucle while en el bloque de lanzamiento de la función onCreate, seguirá corriendo indefinidamente y puede ocurrir ANR debido a la falta de capacidad de respuesta.

Comments are closed.