我有一個lifecycle感知片段范圍協程函式,它檢查從片段的父活動接收到的值是否具有特定值。如果該值是null呼叫具有viewModelScope.launch協程范圍的函式,則在顯示對話框以通知用戶該值禁用某些應用程式功能之前開始倒計時。
問題是viewModelScope.launch協程函式一直被呼叫,即使條件 if 陳述句不正確。我的問題是,如果協程函式位于明顯錯誤的條件內,
為什么要呼叫協程函式?viewModelScope我確實注意到,如果我Log在條件內輸出if它不會被記錄,如果我在條件Log外輸出viewModelScope.launchcoroutine 它也沒有被呼叫。因此,無論條件值如何,作用域代碼都會運行。
解決方法是使 viewmodel 函式成為suspend函式并洗掉viewModelScope.launch協程。但是為什么會呼叫一個不滿足條件的函式。協程是否超越了邏輯的界限?
該lifecycleScope函式具有以下組成:
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
viewModel.status.collectLatest {
binding.contentScanner.tvScannerStatus.text = it
if (statusCheck(it) == null) {
viewModel.reactToInactiveScanner(it) // This function is called even though the condition is false
}
}
}
}
viewModelScope協程:
fun reactToInactiveScanner(s: String) {
viewModelScope.launch {
for(i in 1..5) {
if(isScannerUnavailable(s)) break
delay(1000L)
}
_scannerActive.value = isScannerUnavailable(s)
}
}
uj5u.com熱心網友回復:
statusCheck(it)當您認為它不是 ooor 時 可能為 null,因為reactToInactiveScanner(s: String)在視圖模型范圍內啟動協程并暫停至少 5 秒,并且鑒于視圖模型在配置更改中幸存下來,不管生命周期在做什么,協程在viewmodel 范圍將繼續運行 5 秒。
嘗試使功能暫停:
suspend fun reactToInactiveScanner(s: String) {
for(i in 1..5) {
if(isScannerUnavailable(s)) break
delay(1000L)
}
_scannerActive.value = isScannerUnavailable(s)
}
并在生命周期范圍內啟動它,因此當生命周期停止協程時,協程會被取消,而當協程啟動時,協程會再次啟動
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/532725.html
