【发布时间】:2020-06-27 18:35:14
【问题描述】:
以下是我的用例。
我有一个函数fun requestFocus,这个函数又调用函数fun configure,它依赖于来自系统的回调,因此这个函数 configure 使用计数为 1 的 coundownlatch 并等待直到它在回调时重置为零已收到。
为此,我标记了 requestFocus 暂停并使用 Dispatchers.IO 来完成所有操作。
现在有多个 requestFocus 调用者用于前函数 fun accept。 accept 函数做了很多事情,所有事情都发生在同一个线程上。 accept 函数也可以从主线程或意图服务中调用。我的问题是因为函数配置被阻塞我不想阻塞主线程。
目前accept函数是这样的
fun accept() {
//do something
requestFocus()
// do something
}
我不确定如何从 accept 调用 requestFocus 并让 requestFocus 执行后发生的所有操作以相同的方式发生。我目前在接受功能中所做的如下
fun accept() {
//do something
runBlocking{
requestFocus()
// do something
}
但这会产生问题,因为主线程被阻塞。任何建议我可以尝试什么?我查看了全球范围和主要范围的文档。
【问题讨论】:
-
除非在单元测试中,否则不要使用
runBlocking。否则它完全违背了协程的目的。使用lifecycleScope.launch启动协程。这有点像将 Runnable 发布到主线程,但 lambda 中的代码可以挂起并因此调用suspend函数。所以如果accept()代表一个完整的逻辑流,就用fun accept() = lifecycleScope.launch { /*...*/ }。
标签: android kotlin coroutine kotlin-coroutines