Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么';是否为ConflatedBroadcacstChannel.asFlow()调用t Flow.onCompletion?_Android_Kotlin_Kotlin Coroutines_Kotlin Flow - Fatal编程技术网

Android 为什么';是否为ConflatedBroadcacstChannel.asFlow()调用t Flow.onCompletion?

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 {

在本例中,您更新了一个LiveData api以使用Flow,但我注意到围绕
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
的?