Модифицированный вызов в Kotlin Coroutines viewModelScope - PullRequest
2 голосов
/ 14 апреля 2020

Недавно я обновил свой ViewModel для использования нового viewModelScope, который по умолчанию имеет superviserJob и отменяет обратный вызов job в ViewModel * onClear(). Так что теперь мне не нужно внедрять CourotineScope и выполнять вышеописанный персонал самостоятельно и просто использовать viewModelScope. Из его реализации я вижу, что Dispatchers.Main.immediate установлено по умолчанию CoroutineDispatcher для viewModelScope.

Таким образом, при печати текущего Thread в viewModelScope.launch это дает Thread [main, 5, main]

Но вот мой вопрос. Хотя это выполняется в главном потоке, у меня работает следующий код, который выполняет сетевой вызов.

viewModelScope.launch {
    userRepo.login(email, password)
}

Здесь userRepo.login(email, password) - это функция suspend, которая вызывает функцию Retrofit suspend.

Так как же это работает, если моя текущая тема является основной?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Это работает, потому что реализация Retrofit suspend делегирует Call<T>.enqueue. Это означает, что он по умолчанию уже выполняется на собственном фоновом исполнителе вместо использования вызывающей стороны Dispatcher.

0 голосов
/ 14 апреля 2020

приостановить функции всегда безопасно вызывать из основного потока. Но если вы собираетесь выполнять тяжелые операции, такие как выборка данных с сервера, базы данных, загрузчика контента ... лучше использовать соответствующий диспетчер, например, Dispatcher.IO.

Если вы хотите, вы можете использовать этот диспетчер с viewmodelScope, а затем все функции приостановки выполняются с этим диспетчером.

Теперь ViewModel является Executor (класс, который изменяет выполнение из Main на задний план)

Если вы собираетесь изменить диспетчер в ViewModel, хорошей практикой является внедрение этого Dispatcher с помощью конструктора для тестирования ViewModel.

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