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

问题描述 投票:0回答:2

我通过单击按钮呼叫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
}

输出:

我在Toast中得到0

我要在Toast20000

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

android kotlin async-await kotlin-coroutines
2个回答
1
投票

不确定我是否知道此目的,但是如果这是您想要的,请将Dispatchers.IO替换为Dispatchers.Unconfined


0
投票

您应在dummyFoo()中使用await

private suspend fun dummyFoo() : Int {
    var result : Int = 0
    val waitFor = CoroutineScope(Dispatchers.IO).async {
        for (i in 1..20000) {
            result++
        }
        return@async result
    }
    waitFor.await()
    return result
}
© www.soinside.com 2019 - 2024. All rights reserved.