Почему не вызывается Flow.onCompletion для ConflatedBroadcacstChannel.asFlow ()? - PullRequest
1 голос
/ 27 января 2020

В новой 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 - это хорошее место для размещения любого кода, который необходимо выполнить во время очистки. Здесь мы сбрасываем прядильщик. "

Но это явно не так. Итак, каков будет правильный способ выполнения кода, черного после каждого преобразования, и означает ли это, что кодовая лаборатория неверна или есть что-то, что я неправильно понимаю?

...