调度程序 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。以下是一些示例:

  1. 使用withContext(Dispatchers.IO)我们可以运行一些长的运行ning代码或后台(工作)线程中的网络请求。在这种情况下,我们必须将函数标记为挂起:

    suspend fun doWorkInBackground(): String = withContext(Dispatchers.IO) {
       // long running code
       // return some result
       "Some Result"
    }
    
  2. 使用 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
}