4

Coroutines+Flow/LiveData 的新 Android 代码实验室中,您更新了 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
  }
}

我们在代码实验室结束时得到的 Flow 代码:

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)

当您运行 Flow 时,微调器永远不会消失,因为即使mapLatest转换完成,也不会调用 onCompletion。代码实验室指出,“onCompletion每次上面的流程完成时都会调用它。它与 finally 块相同——它是放置清理期间需要执行的任何代码的好地方。这里我们正在重置微调器。”

但这显然不是真的。那么在每次转换后执行黑色代码的正确方法是什么,这是否意味着代码实验室不正确或者我有什么误解?

4

0 回答 0