gpt4 book ai didi

kotlin - 使用协程的并行请求

转载 作者:行者123 更新时间:2023-12-02 12:07:00 25 4
gpt4 key购买 nike

我正在尝试从多个位置获取一些数据以填充 recyclerView。我曾经使用回调,效果很好,但需要将其重构为协程。

所以我有一个改造服务列表,并称它们为并行。然后我可以使用 onResponse 回调更新 recyclerView。我怎样才能用协程来实现这一点。

我尝试过类似的事情,但在我得到回复后下一个电话被触发:

runblocking {
for (service in services) {
val response = async(Dispatchers.IO) {
service.getResponseAsync()
}
adapter.updateRecyclerView(response.await())
}
}

使用另一种方法时,我遇到的问题是我无法返回主线程来更新我的用户界面,因为我正在使用启动并且无法等待响应:
runblocking {
services.foreach {
launch(Dispatcher.IO) {
val response = it.getResponseAsync()
}
withContext(Dispatcher.Main) {
adapter.updateRecyclerView(response)
}
}
}

我很感激每一个提示;)
干杯帕特里克

最佳答案

使用 launch 启动协程而不是 runBlocking .下面的示例假设您从使用 Dispatchers.Main 的上下文启动默认情况下。如果不是这种情况,您可以使用 launch(Dispatchers.Main)对于这些。

如果您想在每次并行操作返回时更新您的 View ,请将您的 UI 更新移动到您为每个 service 启动的协程中。项目:

for (service in services) {
launch {
val response = withContext(Dispatchers.IO) { service.getResponseAsync() }
adapter.updateRecyclerView(response)
}
}

如果您只需要在所有这些都返回后更新,您可以使用 awaitAll .在这里,您的 updateRecyclerView必须编写函数来处理响应列表而不是一次一个。
launch {
val responses = services.map { service ->
async(Dispatchers.IO) { service.getResponseAsync() }
}
adapter.updateRecyclerView(responses.awaitAll())
}

关于kotlin - 使用协程的并行请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61582532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com