Ошибка времени выполнения для функции приостановки при реализации launchIn - PullRequest
0 голосов
/ 11 марта 2020

Экспериментальная реализация launchIn выдает ошибку, если не реализовать функцию suspend. Я подал проблему , чтобы узнать, предназначено ли это поведение.

Ошибка

Следует вызвать функцию приостановки getFeed только из сопрограммы или другой функции приостановки

Однако, поскольку launchIn является создателем сопрограммы, эта ошибка не представляется действительной.

feedRepository.getFeed().onEach { results ->
  when (results.status) {
    LOADING -> ...
    SUCCESS -> withContext(Dispatchers.Main) {
      _feedViewState._feed.value = results.data
    }
    ERROR -> ...
  }
}
.flowOn(Dispatchers.IO)
.launchIn(viewModelScope)

Оригинальная реализация

viewModelScope.launch(Dispatchers.IO) {
  feedRepository.getFeed().collect {  results ->
    when (results.status) {
      LOADING -> ...
      SUCCESS -> withContext(Dispatchers.Main) {
        _feedViewState._feed.value = results.data
      }
      ERROR -> ...
    }
  }
}

1 Ответ

0 голосов
/ 11 марта 2020

Проблема была решена.

Проблема заключалась в том, что метод getFeed был реализован с синтаксисом suspend. suspend не требуется при возврате потока, поскольку поток запускается декларативно, то есть getFeed определяет код, который будет запускаться при вызове. Код запускается, когда launchIn инициирует его, а не обязательно, когда метод сначала вызывается сам по себе.

Эта концепция хорошо определена в этом докладе, KotlinConf 2019: асинхронные потоки данных с Kotlin Поток Романа Елизарова

До

suspend fun getFeed() = flow { ... }

После

fun getFeed() = flow { ... }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...