我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()
}
}
这伴随着通常的警告,即您不应在全局范围内启动协程,而应为相关活动创建范围。否则,即使用户离开您的应用程序,这些后台任务也会占用CPU。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句