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 Retrofit
suspend
.
Alors, comment cela fonctionne, si mon fil de discussion actuel est le fil de discussion principal?
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.