Приостановка сопрограммы Kotlin до тех пор, пока поток не будет иметь определенное значение

#android #kotlin #kotlin-coroutines

#Android #kotlin #kotlin-сопрограммы

Вопрос:

В настоящее время я играю с сопрограммами и потоками Kotlin. В моем сценарии a MutableStateFlow представляет состояние соединения ( CONNECTING, CONNECTED, CLOSING, CLOSED ). Также можно войти в систему, выйти из системы и снова войти в систему.

Для дальнейшего использования соединения я должен проверить состояние и подождать, пока оно не будет CONNECTED . Если оно уже CONNECTED есть, я могу продолжить. Если нет, мне нужно подождать, пока состояние не достигнет CONNECTED . connect() Вызов возвращается немедленно, результат передается через обратный вызов, который обновляет MutableStateFlow . Моя текущая идея состоит в том, чтобы сделать следующее:

 connect()

if (connectionState.value != State.CONNECTED) { // connectionState = MutableStateFlow(State.CLOSED)

    suspendCoroutine<Boolean> { continuation ->
        scope.launch { // scope = MainScope()
            connectionState.collect {
                if (it == State.CONNECTED) {
                    continuation.resume(true)
                }
            }
        }
    }
}

// continue
 

Поскольку я довольно новичок в этой теме, я не знаю, является ли это хорошей практикой, и я также не смог найти более подходящую концепцию в документации Kotlin. Есть ли какой-нибудь лучший способ сделать это?

Ответ №1:

Некоторое время назад у меня был тот же вопрос:

введите описание изображения здесь

Предпочтительно использовать first() для приостановки до тех пор, пока не будет сопоставлен предикат.

 if (connectionState.value != State.CONNECTED) {
    connectionState.first { it == State.CONNECTED }
}