Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как дождаться завершения всей асинхронной обработки?

Автор вопроса: james04Ответов: 2

У меня есть список запросов, которые я хочу выполнить, и я хочу дождаться их завершения, чтобы выполнить их. Я использую корутины котлина с повторением и асинхронностью, как показано ниже.

viewModelScope.launch(Dispatchers.IO) {
            repeat(serverAccountList.size) {
                async {
                    createHelloRequest(it)  // suspend function
                }
            }


            withContext(Dispatchers.Main) {
                _isLoading.value = false
            }
        }

Как я могу присоединиться к ним, чтобы продолжить свой код в главном диспетчере?

androidkotlinkotlin-coroutinesasync-await

Ответы

Ответ 1 · рейтинг 1 · Marko Topolnik

Не используйте Dispatchers.IO для вызова приостанавливаемых (неблокирующих) функций. Весь ваш код может остаться в Main диспетчере. Кроме того, используйте от coroutineScope до launch столько подзадач, сколько вам нужно, и Kotlin обеспечит выполнение всех до завершения вызова coroutineScope.

Все вместе ваш код должен выглядеть так:

viewModelScope.launch {
    _isLoading.value = true
    coroutineScope {
        repeat(serverAccountList.size) {
            launch { createHelloRequest(it) }
        }
    }
    _isLoading.value = false
}

Ответ 2 · r2rek

Вам нужно вызвать await для асинхронного выполнения - например,

...

val stuff = async {...}
stuff.await()
...

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы