调度程序 IO 总是在 IO.Thread 中 运行 吗? (android 工作室)
is dispatcher IO always run in IO.Thread? (android studio)
我正在学习 android 的协程。
我很好奇 dispatcher.io
书上说当我使用
withcontext(dispatcher.IO)
或
lifecycleScope(Dispatcher.IO)
它将在 IO.Thread 上 运行。
但是书中的其他部分说多协程可以 运行 在主线程中。
dispatcher.io 可以 运行 在主线程中(UI 线程在 android studio 中)?
当您使用 Dispatchers.IO
调度程序时,该块将应用于 运行 后台(工作人员)Thread
。以下是一些示例:
使用withContext(Dispatchers.IO)
我们可以运行一些长的运行ning代码或后台(工作)线程中的网络请求。在这种情况下,我们必须将函数标记为挂起:
suspend fun doWorkInBackground(): String = withContext(Dispatchers.IO) {
// long running code
// return some result
"Some Result"
}
使用 launch
协程构建器。在这种情况下,协程将 运行ning 在后台线程中的 Dispatchers.IO
调度程序上,并且不可能从这样的协程更新 UI (我们需要将协程上下文切换到 Dispatchers.Main
才能更新 UI):
lifecycleScope.launch(Dispatchers.IO) {
// invoke some suspend functions or execute potentially long running code
// to switch context in this case and be able to update UI
withContext(Dispatchers.Main) {
// updateUI
}
}
在第二个示例中,为了避免将协程上下文切换到 Dispatchers.Main
,可以在 Dispatchers.Main
调度程序上 运行 协程并从那里更新 UI:
lifecycleScope.launch(Dispatchers.Main) {
// call some suspend function, but shouldn't call non-suspend
// long running code from here because it will block the Main Thread and UI may freeze
val result = doWorkInBackground()
// Update UI
textView.text = result
}
我正在学习 android 的协程。 我很好奇 dispatcher.io 书上说当我使用
withcontext(dispatcher.IO)
或
lifecycleScope(Dispatcher.IO)
它将在 IO.Thread 上 运行。
但是书中的其他部分说多协程可以 运行 在主线程中。
dispatcher.io 可以 运行 在主线程中(UI 线程在 android studio 中)?
当您使用 Dispatchers.IO
调度程序时,该块将应用于 运行 后台(工作人员)Thread
。以下是一些示例:
使用
withContext(Dispatchers.IO)
我们可以运行一些长的运行ning代码或后台(工作)线程中的网络请求。在这种情况下,我们必须将函数标记为挂起:suspend fun doWorkInBackground(): String = withContext(Dispatchers.IO) { // long running code // return some result "Some Result" }
使用
launch
协程构建器。在这种情况下,协程将 运行ning 在后台线程中的Dispatchers.IO
调度程序上,并且不可能从这样的协程更新 UI (我们需要将协程上下文切换到Dispatchers.Main
才能更新 UI):lifecycleScope.launch(Dispatchers.IO) { // invoke some suspend functions or execute potentially long running code // to switch context in this case and be able to update UI withContext(Dispatchers.Main) { // updateUI } }
在第二个示例中,为了避免将协程上下文切换到 Dispatchers.Main
,可以在 Dispatchers.Main
调度程序上 运行 协程并从那里更新 UI:
lifecycleScope.launch(Dispatchers.Main) {
// call some suspend function, but shouldn't call non-suspend
// long running code from here because it will block the Main Thread and UI may freeze
val result = doWorkInBackground()
// Update UI
textView.text = result
}