链式和并发协同程序,带改造

时间:2019-10-07 09:41:06

标签: android kotlin coroutine

我在管理器类中有一个方法fetchItineraries,该方法应根据出发点的输入列表(标识)来获取行程列表。对于每个Station,都需要使用HTTP POST调用检查可用性,该调用返回一个ID,该ID应在下一个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在内部处理异步/等待并在后台分发请求(使用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
  找到的电台可用空间:1
  获取车站的路线:1
  找到的电台可用空间:2
  获取车站的路线:2
  前往车站的路线:2
  前往车站的路线:1

1 个答案:

答案 0 :(得分:1)

似乎您可以为每个站点启动一个子协程:

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