最近、新しいViewModel
を使用するようにviewModelScope
を更新しました。その実装から、CoroutineDispatcher
のデフォルトのviewModelScope
として_Dispatchers.Main.immediate
_が設定されていることがわかります。
したがって、現在のThread
を_viewModelScope.launch
_に出力すると、Thread [main、5、main]が得られます
しかし、これが私の質問です。これはメインスレッドで実行されますが、次のコードはネットワークコールを実行する私にとっては機能します。
_viewModelScope.launch {
userRepo.login(email, password)
}
_
ここでuserRepo.login(email, password)
はsuspend
関数で、Retrofit
suspend
関数を呼び出します。
では、現在のスレッドがメインスレッドである場合、これはどのように機能しますか?
サスペンド関数は、メインスレッドから呼び出しても常に安全です。ただし、サーバー、データベース、コンテンツローダーからデータをフェッチするような重い操作を行う場合は、Dispatcher.IOなどの適切なディスパッチャーを使用することをお勧めします。
必要に応じて、このディスパッチャーをviewmodelScopeで使用すると、すべての中断機能がこのディスパッチャーで実行されます。
これで、ViewModelはエグゼキュータ(実行をメインからバックグラウンドに変更するクラス)になります。
ViewModelのディスパッチャーを変更する場合は、コンストラクターによってこのDispatcherを挿入してViewModelをテストすることをお勧めします。