我有一个支持lifecycle
的片段作用域协程函数,它检查从片段的父Activity接收到的值是否具有特定的值。如果该值是null
,则调用一个具有viewModelScope.launch
协程作用域的函数,在显示一个对话框通知用户该值禁用了某些应用功能之前开始倒计时。
问题是viewModelScope.launch
协程函数总是被调用,即使条件if语句不为真。
我的问题是,如果viewModelScope
协程函数在一个明显为假的条件内,为什么它会被调用?我注意到,如果我Log
输出在if
条件内,它不会被记录,如果我Log
输出在viewModelScope.launch
协程外,它也不会被调用。因此,不管条件的值如何,作用域代码都会运行。
解决这个问题的方法是把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)
}
}
1条答案
按热度按时间falq053o1#
当您认为
statusCheck(it)
不是ooor时,它可能是null,因为reactToInactiveScanner(s: String)
在视图模型范围内启动了一个协程,并暂停了至少5秒,并且假定视图模型在配置更改后仍然存在,无论生命周期正在做什么,视图模型范围内的协程都将继续运行5秒。尝试使函数暂停:
并在生命周期范围内启动它,所以当生命周期停止时,协同程序被取消,当生命周期开始时,协同程序被再次启动