В новой Android лаборатории кода для Coroutines + Flow / LiveData вы обновляете API LiveData для использования 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)
При запуске потока счетчик никогда не исчезает, потому что onCompletion никогда не вызывается, даже когда преобразование mapLatest
завершено. Лаборатория кода заявляет: «onCompletion
будет вызываться каждый раз, когда поток над ним завершается. Это то же самое, что и блок finally - это хорошее место для размещения любого кода, который необходимо выполнить во время очистки. Здесь мы сбрасываем прядильщик. "
Но это явно не так. Итак, каков будет правильный способ выполнения кода, черного после каждого преобразования, и означает ли это, что кодовая лаборатория неверна или есть что-то, что я неправильно понимаю?