web-dev-qa-db-fra.com

Appel de mise à niveau dans la vue Kotlin Coroutines

Récemment, j'ai mis à jour mon ViewModel pour utiliser le nouveau viewModelScope. D'après son implémentation, je vois que Dispatchers.Main.immediate Est défini comme valeur par défaut CoroutineDispatcher pour viewModelScope.

Ainsi, lors de l'impression du Thread courant dans viewModelScope.launch, Cela donne Thread [main, 5, main]

Mais voici ma question. Bien que cela fonctionne dans le thread principal, le code suivant fonctionne pour moi qui effectue un appel réseau.

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

Ici userRepo.login(email, password) est suspend function, qui appelle la fonction Retrofitsuspend.

Alors, comment cela fonctionne, si mon fil de discussion actuel est le fil de discussion principal?

6
Tiko

les fonctions de suspension peuvent toujours être appelées en toute sécurité depuis le thread principal. Mais si vous allez faire des opérations lourdes comme récupérer des données depuis un serveur, une base de données, un chargeur de contenu ... il est préférable d'utiliser le répartiteur approprié, par exemple Dispatcher.IO.

Si vous le souhaitez, vous pouvez utiliser ce répartiteur avec le viewmodelScope, puis toutes les fonctions de suspension s'exécutent avec ce répartiteur.

Maintenant, le ViewModel est un exécuteur (une classe qui change l'exécution de Main en arrière-plan)

Si vous souhaitez modifier le répartiteur dans le ViewModel, une bonne pratique consiste à injecter ce répartiteur par constructeur pour tester le ViewModel.

0
Manuel Mato