У меня есть метод fetchItineraries
в классе менеджера, который должен получить список маршрутов на основе входного списка (идентификаторов) пунктов отправления. Для каждого Station
доступность должна проверяться с помощью вызова HTTP POST, который возвращает идентификатор, который должен использоваться сразу при следующем вызове HTTP GET, чтобы найти маршрут.
fun fetchItineraries(departure: Station) {
val stations = departure.getDepartureStations()
//Fetch all availabilities
scope.launch {
stations.forEach {
println("Station: ${it.name}")
getAvailability(station)
}
}
}
Насколько японимаю, сопрограмма запускается в главном потоке (используя Dispatchers.Main
). Retrofit обрабатывает async / await внутри и отправляет запрос изнутри (используя метод enqueue
).
suspend fun getAvailability(station: Station) {
try {
val response = Api.networkApi.getAvailability(station.id)
if (response.isSuccessful) {
val requestId = response.body()?.requestId ?: ""
//Fetch the itinerary
fetchItinerary(requestId)
}
} catch (e: java.lang.Exception) {
}
}
Теперь основной поток отображает неблокирующий индикатор загрузки и после того, как все вызовы быливыполнено (все возможные маршруты выбраны), результаты должны быть отображены, а индикатор удален.
В моем текущем приложении я получаю следующие строки журнала:
Доступность выборкидля станции: 1
Доступность найденных для станции: 1
Выбор маршрутов для станции: 1
Выбранные маршруты для станции: 1
Доступность выборки для станции: 2
Доступностьнайдено для станции: 2
Выбор маршрутов для станции: 2
Маршруты выбраны для станции: 2
Однако я хочу привести к следующему (возможный результат):
Доступность выборки для станции: 1
Доступность выборки для станции: 2
Доступность найдена для станцииon: 1
Выбор маршрутов для станции: 1
Доступность найденных станций: 2
Выбор маршрутов для станции: 2
Выбор маршрутов для станции: 2
Выбор маршрутов для станции: 1