у меня есть такой код:
class MyViewModel: ViewModel() {
val myRepository = ExampleRepository()
init {
fetchServerRequest()
}
fun reload() {
fetchServerRequest()
}
private fun fetchServerRequest() {
viewModelScope.launch {
myRepository.fetchServerRequest() //repository returns Flow<String>
.collect {
//handle result
}
}
}
}
Репозиторий возвращает холодный Flow. Правильно ли создавать новую сопрограмму c каждый раз, когда я вызываю этот метод?
Или сопрограмма будет завершена, когда будет завершен код в сборе?
То, что вы делаете, в порядке, viewModelScope.launch()
не создает новый Coroutine
, он создает новый Job
, вы можете увидеть возвращаемый тип, если наведете мышь на launch()
.
Or coroutine will be finished when code in collect will finished?
Вы можете проверить мой другой пост здесь.
Этот ответ неверен в обоих случаях. Там является проблема с кодом ОП. Каждый раз, когда они пытаются обновить данные, они начинают сбор другой копии потока, не останавливая предыдущий сбор, поэтому у них будет много одновременных запущенных сопрограмм и сбор параллельных потоков. Кроме того, задание является ссылкой на запущенную сопрограмму, а launch
делает создает сопрограмму. (Нет класса Coroutine или типа интерфейса.) Если следовать исходному коду, launch()
буквально вызывает createCoroutine()
из-под капота.
Это зависит от того, что вы пытаетесь сделать. Ожидаете ли вы, что
fetchServerRequest()
будет возвращать поток с разными результатами каждый раз, когда вы его вызываете? Это было бы странно, поскольку у него нет параметров. Если нет, то нет смысла получать новую ссылку на Flow. Если так, то все в порядке, но вам нужно отменять предыдущую сопрограмму каждый раз, когда вы запускаете новую.