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

库沙尔

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条评论
登录后参与评论

相关文章

来自分类Dev

如何从协程范围返回值

来自分类Dev

如何等待$ .getJson的返回值

来自分类Dev

如何从异步协程作用域(例如ViewModelScope)返回值到UI?

来自分类Dev

如何等待协程结束

来自分类Dev

异步等待如何使用返回值

来自分类Dev

如何等待请求响应并返回值?

来自分类Dev

在返回值之前,如何等待回调完成?

来自分类Dev

如何等待协程,直到满足条件?

来自分类Dev

协程如何等待数据然后继续处理

来自分类Dev

如何由于超时而从已取消的python asyncio协程返回值

来自分类Dev

关于asyncio模块,如何获取子协程的返回值?

来自分类Dev

是否有从协程端点返回值的标准方法

来自分类Dev

是否有从协程端点返回值的标准方法

来自分类Dev

要求提供示例代码以了解协程中throw()的返回值,该协程返回值

来自分类Dev

快速等待异步函数返回值

来自分类Dev

使用异步等待不返回值

来自分类Dev

AJAX异步回调正常工作,但是如何等待返回的值

来自分类Dev

如何等待所有boost:asio的堆栈协程完成?

来自分类Dev

如何等待协程Dispatch.IO数据库查询完成以填充RecyclerView

来自分类Dev

如何模拟异步协程?

来自分类Dev

如何等待异步委托

来自分类Dev

如何等待异步委托

来自分类Dev

如何使用异步和等待从订阅 API 调用中获取返回值

来自分类Dev

任务返回值,不带Task <T>(异步/等待模式)

来自分类Dev

Javascript-异步等待并获取-返回值,而不是诺言?

来自分类Dev

异步/等待任务没有返回值

来自分类Dev

没有从异步等待函数获取返回值

来自分类Dev

任务返回值,不带Task <T>(异步/等待模式)

来自分类Dev

异步/等待 -> 可能没有返回值?

Related 相关文章

热门标签

归档