在我的 Android 應用程式中,我有一個用例,只要應用程式正在運行,我就需要在回圈中運行一些代碼。
示例代碼:
fun exampleRunCodeInLoop() {
viewModelScope.launch(Dispatchers.Default) {
while (true) {
delay(5000) // Wait for 5 seconds
// @param someCondition is just an example for the if statement
if (someCondition == true) {
withContext(Dispatchers.Main) {
// Do something on Main thread
}
}
}
}
}
我Dispatcher對使用哪個launch塊以獲得最佳性能感到困惑。我應該使用Default,IO還是只運行所有內容Main?
uj5u.com熱心網友回復:
至少這是我對協程調??度程式所做的用法。
Dispatchers.Default- 我通常只在執行 CPU 密集型任務以與主執行緒上的當前任務并行時使用它,它具有固定的大小,硬編碼為可用處理器的數量,因為這對 CPU 密集型任務有意義。與回圈、數學運算、資料/影像操作等操作一起使用。
Dispatchers.IO- 旨在將阻塞 IO 任務卸載到共享執行緒池。如果您在執行阻塞 IO 時仍然需要比內核更多的執行緒,請使用,例如,資料庫查詢是 IO 操作或網路呼叫
Dispatchers.Main- 一個協程調度器,它被限制在操作 UI 物件的主執行緒中。這個調度器可以直接使用,也可以通過 MainScope 工廠使用。通常這樣的調度程式是單執行緒的。通常在您完成或完成來自 IO 或 Default 的后臺任務時使用,以預測您對 UI 或主執行緒所做的操作的任何結果。
uj5u.com熱心網友回復:
- 如果你在做 IO,使用 IO one
- 如果你正在做一些 CPU 密集型的事情,請使用默認的
uj5u.com熱心網友回復:
在不進行大量計算或 IO 的代碼示例中,沒有任何內容會阻塞,因此您可以在 Dispatchers.Main 中啟動,而無需為任何內容切換背景關系。delay是一個掛起函式,所以它不會阻塞。當你呼叫掛起函式時,你永遠不必擔心你在哪個調度程式上(除非有人不知道他們在做什么并且已經撰寫了一個阻塞的掛起函式)。
如果您沒有在主執行緒上做所有事情,那么無論如何您都會在調度程式之間來回切換,因此只要您將適當的部分包裝在其中withContext并使用適當的調度程式,您啟動哪個調度程式都沒有關系。一般約定是,如果您的協程與 UI 互動,則在 Main 中啟動它并包裝非主要部分。這遵循 Android 中所有非協程代碼的約定,這些代碼被撰寫為在大多數方法中從主執行緒呼叫。
uj5u.com熱心網友回復:
Dispatchers.Default 因為它是為計算而設計的,通過使用共享執行緒池,其中包含的最大執行緒數等于 CPU 內核數
Dispatchers.IO 萬一你阻塞了執行緒,等待回應而不做繁重的計算邏輯
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/333533.html
