Как отменить сбор сопрограммы StateFlow?

Я собираю поток из общей модели просмотра во фрагменте:

      private val viewModel: MyViewModel by sharedViewModel()

private fun observeViewModelStateFlowData() {
job = lifecycleScope.launch {
            viewModel.stateFlowData.collect {
                when (it) {
                    is ViewStates.Success -> handleSuccess(it.data)
                }
            }
        }
    }

в ViewModel:

      private val _stateFlowData = MutableStateFlow<ViewStates<Model>>(ViewStates.Idle)
val stateFlowData: StateFlow<ViewStates<Model>> get() = _stateFlowData

но когда я перехожу к следующему фрагменту и снова возвращаюсь к этому фрагменту, поток снова собирается. Я отменяю задание в методе жизненного цикла onStop() фрагмента:

      override fun onStop() {
    job?.cancel()
    super.onStop()
}

но не отменять и собирать заново !!!

Это происходит, даже когда я выхожу из активности (когда модель просмотра очищается) и снова возвращаюсь к активности !!!

Как я могу это сделать, чтобы предотвратить скопление потока?

1 ответ

Что ж, вам нужно кое-что знать о сопрограммах. Если мы просто вызываем отмену, это не значит, что работа сопрограммы просто остановится. Если вы выполняете относительно тяжелые вычисления, такие как чтение из нескольких файлов, нет ничего, что автоматически останавливает выполнение вашего кода.

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

      job = lifecycleScope.launch {
            viewModel.stateFlowData.collect {
                ensureActive()
                when (it) {
                    is ViewStates.Success -> handleSuccess(it.data)
                }
            }
        }
    }

Для получения дополнительной информации ознакомьтесь с этой статьей https://medium.com/androiddevelopers/cancellation-in-coroutines-aa6b90163629.

Другие вопросы по тегам