运行 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)
}
}
我正在处理实时数据。我想 运行 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)
}
}