android-fragments 生命周期范围感知片段范围协程调用视图模型协程范围函数,即使未调用

nfg76nw0  于 2022-11-13  发布在  Android
关注(0)|答案(1)|浏览(231)

我有一个支持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)
    }
}
falq053o

falq053o1#

当您认为statusCheck(it)不是ooor时,它可能是null,因为reactToInactiveScanner(s: String)在视图模型范围内启动了一个协程,并暂停了至少5秒,并且假定视图模型在配置更改后仍然存在,无论生命周期正在做什么,视图模型范围内的协程都将继续运行5秒。
尝试使函数暂停:

suspend fun reactToInactiveScanner(s: String) {
        for(i in 1..5) {
            if(isScannerUnavailable(s)) break
            delay(1000L)
        }
        _scannerActive.value = isScannerUnavailable(s)
}

并在生命周期范围内启动它,所以当生命周期停止时,协同程序被取消,当生命周期开始时,协同程序被再次启动

相关问题