Вызов await()
приостанавливает текущую сопрограмму и освобождает текущий поток для присоединения другими подпрограммами из очереди.
Так, когда вызывается await()
, текущая сопрограмма приостанавливается до получения ответа, и это почему l oop не завершается (переход к следующей итерации перед завершением запроса перед запросом).
Во-первых, здесь не следует использовать runBlocking
, поэтому крайне не рекомендуется используется в рабочей среде.
Вместо этого следует использовать область ViewModel, предоставленную android для структурированного параллелизма (отменяет запрос, если он больше не нужен, например, если жизненный цикл активности закончен).
Вы можете использовать область видимости модели, подобную этой, в упражнении или фрагменте viewModelOwner.viewModelScope.launch(/*Other dispatcher if needed*/) {}
или создать область сопрограммы самостоятельно с прикрепленным заданием, которое отменяет себя на onDestroy.
Для решения проблемы сопрограмма не выполняет параллельные запросы , вы можете запустить несколько запросов без ожидания (ING) на них внутри для l oop. * 1 017 *
И выберите их, используя выражение выбора https://kotlinlang.org/docs/reference/coroutines/select-expression.html#selecting -deferred-values
Пример:
viewModelOwner.viewModelScope.launch {
val responses = mutableListOf<Deferred<TypeReturnedFromGetResponse>>()
for (service in services) {
async(Dispatchers.IO) {
service.getResponseAsync()
}.let(responses::add)
}
// adds which ever request is done first in oppose to awaiting for all then update
for (i in responses.indices) {
select<Unit> {
for (response in responses) {
response.onAwait {
adapter.updateRecyclerView(it)
}
}
}
}
}
PS: использование этого метода выглядит некрасиво, но обновит адаптер, как только будет решен первый запрос, вместо того, чтобы ждать каждого запроса и затем обновлять элементы в нем.