协程暂停功能和阻止调用

时间:2020-03-16 16:15:54

标签: android kotlin coroutine kotlin-coroutines

下面是我的用例。 我有一个函数fun requestFocus,此函数依次调用函数fun configure,该函数依赖于系统的回调,因此该函数 configure 使用带有计数1的coundownlatch并等待直到将其重置为收到回调时为零。 为此,我将requestFocus标记为暂停,并使用Dispatchers.IO进行所有操作。 现在,前功能fun accept requestFocus 有多个调用方。函数 accept 可以完成很多事情,并且所有这些事情都发生在同一线程上。函数 accept 也可以从主线程或意图服务中调用。我的问题是,因为函数configure阻塞了,所以我不想阻塞主线程。 当前接受函数如下所示

fun accept() {
    //do something
    requestFocus()
    // do something
}

我不确定如何才能从accept调用requestFocus,并确保在requestFocus执行后发生的所有操作都以相同的方式发生。我目前在接受功能中所做的事情如下

fun accept() {
    //do something
    runBlocking{
    requestFocus()
    // do something
}

但是这会在主线程被阻塞时造成问题。有什么建议可以尝试吗?我已经研究了全球范围和主要范围的文档。

1 个答案:

答案 0 :(得分:1)

您正在寻找withContext块。 withContext的行为类似于runBlocking,但是它挂起线程而不是阻塞线程。

suspend fun accept() {
    //do something on calling thread
    withContext(Dispatchers.IO){ // Changes to Dispatchers.IO and suspends the calling thread
        requestFocus() // Calls requestFocus() on Dispatchers.IO
        // do something on Dispatchers.IO
    }
    // Resumes calling thread
}

您需要从协同程序范围或另一个挂起函数调用accept。或者,您可以使用launch创建一个协程以启动协程:

fun accept() = launch(Dispatchers.Main) { // Starts a coroutine on the main thread
    //do something on main thread
    withContext(Dispatchers.IO){ // Changes to Dispatchers.IO and suspends the main thread
        requestFocus() // Calls requestFocus() on Dispatchers.IO
        // do something on Dispatchers.IO
    }
    // Resumes main thread
}