Правильно ли создается viewModelscope.launch при каждом запросе?

у меня есть такой код:

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 каждый раз, когда я вызываю этот метод?

Или сопрограмма будет завершена, когда будет завершен код в сборе?

Это зависит от того, что вы пытаетесь сделать. Ожидаете ли вы, что fetchServerRequest() будет возвращать поток с разными результатами каждый раз, когда вы его вызываете? Это было бы странно, поскольку у него нет параметров. Если нет, то нет смысла получать новую ссылку на Flow. Если так, то все в порядке, но вам нужно отменять предыдущую сопрограмму каждый раз, когда вы запускаете новую.

Tenfour04 22.03.2022 19:17
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы делаете, в порядке, viewModelScope.launch() не создает новый Coroutine, он создает новый Job, вы можете увидеть возвращаемый тип, если наведете мышь на launch().

Or coroutine will be finished when code in collect will finished?

Вы можете проверить мой другой пост здесь.

Этот ответ неверен в обоих случаях. Там является проблема с кодом ОП. Каждый раз, когда они пытаются обновить данные, они начинают сбор другой копии потока, не останавливая предыдущий сбор, поэтому у них будет много одновременных запущенных сопрограмм и сбор параллельных потоков. Кроме того, задание является ссылкой на запущенную сопрограмму, а launchделает создает сопрограмму. (Нет класса Coroutine или типа интерфейса.) Если следовать исходному коду, launch() буквально вызывает createCoroutine() из-под капота.

Tenfour04 22.03.2022 19:19

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