Сопутствующие и сопутствующие сопрограммы с Retrofit - PullRequest
0 голосов
/ 07 октября 2019

У меня есть метод 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

1 Ответ

1 голос
/ 07 октября 2019

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

//Fetch all availabilities
scope.launch {
    stations.forEach {
        println("Station: ${it.name}")
        launch { getAvailability(it) }
    }
}
...