【发布时间】:2019-07-10 05:15:14
【问题描述】:
我是 Kotlin/Coroutines 的新手,所以希望我只是遗漏了一些东西/不完全理解如何为我要解决的问题构建我的代码。
本质上,我正在获取一个字符串列表,对于列表中的每个项目,我想将它发送到另一个方法来完成工作(进行网络调用并根据响应返回数据)。 (编辑:)我希望所有调用同时启动,并阻塞直到所有调用完成/响应被执行,然后返回一个包含每个响应信息的新列表。
我可能还不完全了解何时使用启动/异步,但我尝试同时使用启动(joinAll)和异步(await)。
fun processData(lstInputs: List<String>): List<response> {
val lstOfReturnData = mutableListOf<response>()
runBlocking {
withContext(Dispatchers.IO) {
val jobs = List(lstInputs.size) {
launch {
lstOfReturnData.add(networkCallToGetData(lstInputs[it]))
}
}
jobs.joinAll()
}
}
return lstofReturnData
我期望发生的是,如果我的 lstInputs 的大小为 120,当所有作业都加入时,我的 lstOfReturnData 的大小也应该为 120。
实际发生的是不一致的结果。我会运行一次,我在最终列表中得到 118,再次运行它,它是 120,再次运行它,它是 117,等等。在 networkCallToGetData() 方法中,我正在处理任何异常,至少返回一些东西对于每个请求,无论网络调用是否失败。
任何人都可以帮助解释为什么我得到不一致的结果,以及我需要做些什么来确保我适当地阻止并且在继续之前加入所有作业?
【问题讨论】:
标签: kotlin kotlin-coroutines jobs