下面是我的用例。
我有一个函数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
}
但是这会在主线程被阻塞时造成问题。有什么建议可以尝试吗?我已经研究了全球范围和主要范围的文档。
答案 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
}