gpt4 book ai didi

android - 如何等待并从异步协程正确返回值

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

我调用 function (非暂停)从按钮单击。我想在 function 中运行一个循环使用 async协程并返回最后一个计算值。

我的代码:

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

btnCount.setOnClickListener {

var result = GlobalScope.async { dummyFoo() }
runBlocking {
Toast.makeText(this@MainActivity, result.await().toString(), Toast.LENGTH_LONG).show()
}
}
}

private fun dummyFoo() : Int {
var result : Int = 0
val waitFor = CoroutineScope(Dispatchers.IO).async {
for (i in 1..20000) {
result++
}
return@async result
}

return result
}

输出 :

我收到 0 Toast .

我要 20000 Toast .

如何让我的代码等到循环完成并且结果变为 20000并输出它?

最佳答案

您似乎想从 GUI 线程启动 CPU 密集型任务,然后在 GUI 中呈现结果。这是协程的一个基本用例,解决方法如下:

btnCount.setOnClickListener {
GlobalScope.launch(Dispatchers.Main) {
val result = withContext(Dispatchers.Default) {
dummyFoo()
}
Toast.makeText(this@MainActivity, result.toString(), Toast.LENGTH_LONG).show()
}
}

这与通常的警告相一致,即您不应该在全局范围内启动协程,而是为相关 Activity 创建一个范围。否则,即使用户离开您的应用程序,这些后台任务也会占用 CPU。

关于android - 如何等待并从异步协程正确返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59557756/

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