在Coroutines+Flow/LiveData 的新 Android 代码实验室中,您更新了 LiveData api 以使用 Flow,但我注意到一些onCompletion
未按预期调用的意外行为。我们要替换的 LiveData 代码:
viewModelScope.launch {\n try {\n _spinner.value = true\n ...query some data...\n } catch (error: Throwable) {\n _snackbar.value = error.message\n } finally {\n _spinner.value = false\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n我们在代码实验室结束时得到的流程代码:
\n\nval growZoneChannel = ConflatedBroadcastChannel<Int>()\n...\ngrowZoneChannel.asFlow()\n .mapLatest { growZone ->\n _spinner.value = true\n ...query some data...\n }\n .onCompletion { _spinner.value = false }\n .catch { throwable -> _snackbar.value = throwable.message }\n .launchIn(viewModelScope)\n
Run Code Online (Sandbox Code Playgroud)\n\n当您运行 Flow 时,微调器永远不会消失,因为即使mapLatest
转换完成,也永远不会调用 onCompletion。代码实验室声明,“ …