Android 为什么';是否为ConflatedBroadcacstChannel.asFlow()调用t Flow.onCompletion?
在本例中,您更新了一个LiveData api以使用Flow,但我注意到围绕Android 为什么';是否为ConflatedBroadcacstChannel.asFlow()调用t Flow.onCompletion?,android,kotlin,kotlin-coroutines,kotlin-flow,Android,Kotlin,Kotlin Coroutines,Kotlin Flow,在本例中,您更新了一个LiveData api以使用Flow,但我注意到围绕onCompletion的一些意外行为没有按预期得到调用。我们正在替换的LiveData代码: viewModelScope.launch { try { _spinner.value = true ...query some data... } catch (error: Throwable) { _snackbar.value = error.message } finally {
onCompletion
的一些意外行为没有按预期得到调用。我们正在替换的LiveData代码:
viewModelScope.launch {
try {
_spinner.value = true
...query some data...
} catch (error: Throwable) {
_snackbar.value = error.message
} finally {
_spinner.value = false
}
}
我们在代码实验室末尾得到的流程代码:
val growZoneChannel = ConflatedBroadcastChannel<Int>()
...
growZoneChannel.asFlow()
.mapLatest { growZone ->
_spinner.value = true
...query some data...
}
.onCompletion { _spinner.value = false }
.catch { throwable -> _snackbar.value = throwable.message }
.launchIn(viewModelScope)
val growtzonechannel=confollatedbroadcastchannel()
...
growtzonechannel.asFlow()
.mapLatest{growZone->
_spinner.value=true
…查询一些数据。。。
}
.onCompletion{u spinner.value=false}
.catch{throwable->_snackbar.value=throwable.message}
.launchIn(viewModelScope)
运行流时,微调器永远不会消失,因为即使mapLatest
转换完成,也不会调用onCompletion。代码实验室声明,“onCompletion
将在其上面的流每次完成时调用。它与finally块相同–它是放置清理期间需要执行的任何代码的好地方。这里我们重置微调器。”
但这显然不是事实。那么,在每次转换后执行黑色代码的正确方法是什么,这是否意味着代码实验室不正确,或者我有什么误解?
onCompletion
是在growZoneChannel
上调用close
时调用的。你在哪里关闭频道?因为growZoneChannel
正在从UI事件中获取值,我从未关闭过它,因为用户可以选择一个新的增长区域,然后我们将无法向关闭的频道提供新的值,对吗?不,你不能向关闭的频道发送更多值。也许你可以关闭旧的频道,然后创建一个新的频道?如果要运行onCompletion
-块,必须关闭它。您误解了“流程完成”的含义。您似乎认为这意味着单个项目的转换完成,但实际上这意味着整个流程完成。如果您想添加要对每个项目执行的操作,只需将这些操作添加到mapLatest
块中,如果您需要,请在try finally
块中。您是如何将项目发送到GrowthZoneChannel
的?