Coroutines+Flow/ LiveDataの新しい Android コード ラボではonCompletion
、LiveData API を更新して Flow を使用しますが、期待どおりに呼び出されないという意図しない動作に気付きました。置き換える 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)
mapLatest
Flow を実行すると、変換が完了しても onCompletion が呼び出されないため、スピナーが消えることはありません。コード ラボには、「onCompletion
上記のフローが完了するたびに呼び出されます。これは finally ブロックと同じものです。クリーンアップ中に実行する必要があるコードを配置するのに適した場所です。ここでスピナーをリセットします。」
しかし、これは明らかに正しくありません。それでは、各変換後にコード ブラックを実行する適切な方法は何でしょうか。これは、コード ラボが正しくないことを意味するのでしょうか、それとも私が誤解しているものがあるのでしょうか?