我有一些簡單的“hello world”代碼,我想知道為什么列印的最后一條陳述句不是這個日志陳述句:
Log.v("myFunc", "finished count")
我的任務是創建一個supervisorScope等待所有掛起函式完成然后列印出一條訊息的函式。這是代碼:
suspend fun fun1() {
Log.v("myFunc", "1")
}
suspend fun fun2() {
Log.v("myFunc", "2")
}
suspend fun fun3() {
Log.v("myFunc", "3")
}
suspend fun fun4() {
delay(3000L)
Log.v("myFunc", "4")
}
suspend fun fun5() {
Log.v("myFunc", "5")
}
suspend fun fun6() {
Log.v("myFunc", "6")
}
后來在其他地方我這樣做:
viewModelScope.launch(dispatchers.IO) {
supervisorScope {
launch { fun1() }
launch { fun2() }
launch { fun3() }
launch { fun4() }
launch { fun5() }
launch { fun6() }
Log.v("myFunc", "finished count")
}
}
這是日志結果:
2022-10-15 19:48:13.722 V/myFunc: 1
2022-10-15 19:48:13.722 V/myFunc: 3
2022-10-15 19:48:13.722 V/myFunc: finished count
2022-10-15 19:48:13.722 V/myFunc: 5
2022-10-15 19:48:13.722 V/myFunc: 6
2022-10-15 19:48:13.723 V/myFunc: 2
2022-10-15 19:48:16.724 V/myFunc: 4
我很驚訝最后的結果不是“完成計數”。我究竟做錯了什么 ?請注意,函式 4 故意延遲它應該無關緊要,因為我仍然希望在列印我的最終陳述句之前完成所有啟動的函式。
uj5u.com熱心網友回復:
在這種情況下,不能保證最后列印日志。為了實作您的目標,應將日志移出supervisorScope:
viewModelScope.launch(Dispatchers.IO) {
supervisorScope {
launch { fun1() }
launch { fun2() }
launch { fun3() }
launch { fun4() }
launch { fun5() }
launch { fun6() }
}
Log.v("myFunc", "finished count")
}
在這種情況下,協程將等到supervisorScope完成所有作業(supervisorScope一旦給定塊及其所有子協程完成后回傳),然后將列印日志。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/514408.html
