运行 IO 线程调度完成时主线程中的代码?

Run code in main thread when IO thread dispatch completes?

我正在处理实时数据。我想 运行 IO 中的一些任意代码然后一旦完成,运行 主线程中的一些任意代码。

在 JavaScript 中,您可以通过将承诺链接在一起来完成类似的事情。我知道 Kotlin 是不同的,但这至少是我所理解的框架。

我有一个函数,有时会从 Main 调用,有时会从 IO 调用,但它本身不需要特殊的 IO 功能。来自 class VM: ViewModel():

private val mState = MyState() // data class w/property `a`
val myLiveData<MyState> = MutableLiveData(mState)

fun setVal(a: MyVal) {
    mState = mState.copy(a=a)
    myLiveData.value = mState
}

fun buttonClickHandler(a: MyVal) {
    setVal(a) // Can execute in Main
}

fun getValFromDb() {
    viewModelScope.launch(Dispatchers.IO) {
        val a: MyVal = fetchFromDb()
        setVal(a) // Error! Cannot call setValue from background thread!
    }
}

在我看来,显而易见的方法是从 IO 执行 val a = fetchFromDb(),然后将 setVal(a) 拉出该块并进入 Main。

有没有办法做到这一点?我没有看到此功能不存在的概念原因。有没有像

这样的想法
doAsyncThatReturnsValue(Dispatchers.IO) { fetchFromDb()}
    .then(previousBlockReturnVal, Dispatchers.Main) { doInMain() }

这可能是 ViewModel 中的 运行?

请在上面适当的地方用 "coroutine" 代替 "thread"。 :)

启动正常。您只需切换调度程序并使用 withContext:

fun getValFromDb() {
    // run this coroutine on main thread
    viewModelScope.launch(Dispatchers.Main) {
        // obtain result by running given block on IO thread
        // suspends coroutine until it's ready (without blocking the main thread)
        val a: MyVal = withContext(Dispatchers.IO){ fetchFromDb() }
        // executed on main thread
        setVal(a) 
    }
}