我在管理器类中有一个方法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
答案 0 :(得分:1)
似乎您可以为每个站点启动一个子协程:
//Fetch all availabilities
scope.launch {
stations.forEach {
println("Station: ${it.name}")
launch { getAvailability(it) }
}
}