在 Android 的背景關系中,調度程式與主執行緒之間有什么區別。
根據我參考檔案的理解,
它由 JVM 上的共享執行緒池提供支持。默認情況下,此調度程式使用的最大并行級別等于 CPU 內核數,但至少為 2。并行度 X 保證在這個調度器中并行執行的任務不超過 X 個。
它會產生一個新執行緒,還是會根據日志名稱DefaultDispatcher-worker-1有一個作業執行緒與除主執行緒之外的執行緒池進行通信以處理協程塊或作業執行緒本身是一個協程?
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val timeInMillis = measureTimeMillis {
GlobalScope.launch(Dispatchers.Default) {
Log.d(TAG, "Starting coroutine in thread ${Thread.currentThread().name}")
val answer = doNetworkCall()
withContext(Dispatchers.Main) {
Log.d(TAG, "Setting text in thread ${Thread.currentThread().name}")
}
}
}
Log.d(TAG, "(The operation took $timeInMillis ms)")
}
uj5u.com熱心網友回復:
Dispatcher 本質上是一個執行緒池。使用時launch(Dispatchers.Default),協程中用于運行代碼的Thread將從中獲取Dispatchers.Default。每次在協程中有一個掛起函式呼叫時,當協程在該呼叫后恢復時,它可能會在來自同一Dispatchers.Default執行緒池的不同 Thread 實體上恢復。
"DefaultDispatcher-worker-1"是Thread來自Dispatcher.Default的池的文字實體的名稱。
withContext本身是一個掛起函式呼叫,因此withContext塊之后的任何代碼也將在某些執行緒上從Dispatchers.Default. (您的示例中沒有)。
里面的代碼withContext(Dispatchers.Main)將在一個執行緒上運行Dispatchers.Main。
Dispatchers.Main 是一個特殊的 Dispatcher,它只有一個執行緒,并且該執行緒與作業系統使用的主執行緒相同。
您應該很少需要使用GlobalScope并且不鼓勵使用它,因為它不允許輕松管理協程生命周期。如果您lifecycleScope改為使用,當關聯的 Activity 或 Fragment 關閉時,您的協程將自動取消。這通常是您想要的,因為 Activity 或 Fragment 不應該在它消失后繼續作業。
通常在 Android 上,大多數協程應該從lifecycleScope或viewModelScope不需要指定 Dispatcher,因為這些范圍默認使用Dispatchers.Main通常是您想要的。(實際上,他們使用了一個不同的調度程式Dispatchers.Main.immediate,它也使用主執行緒,但也可以立即運行協程的第一部分,而無需推遲到主執行緒回圈的下一幀。這不是您需要擔心的區別。)您可以包裝您的協程中需要其他調度程式的部分withContext。如果您只是呼叫掛起函式,則不需要這樣做。按照慣例,如果需要,可以暫停函式以在內部委托給特定的 Dispatcher。
上一段的一個例外可能是,如果您正在啟動一個協程,viewModelScope它會執行一些阻塞作業并且從不涉及任何僅主執行緒的內容。然后您可以跳過withContext并使用 顯式指定調度程式launch。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376202.html
上一篇:如何在繪制的羅盤周圍實作度數
