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

库沙尔

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
}

输出:

我进0Toast

我想20000Toast

如何使我的代码等待循环完成,结果变成20000并输出呢?

马克·托波尼克(Marko Topolnik)

似乎您想从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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章