web-dev-qa-db-ja.com

KotlinコルーチンのviewModelScopeでの改造呼び出し

最近、新しい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関数で、Retrofitsuspend関数を呼び出します。

では、現在のスレッドがメインスレッドである場合、これはどのように機能しますか?

6
Tiko

サスペンド関数は、メインスレッドから呼び出しても常に安全です。ただし、サーバー、データベース、コンテンツローダーからデータをフェッチするような重い操作を行う場合は、Dispatcher.IOなどの適切なディスパッチャーを使用することをお勧めします。

必要に応じて、このディスパッチャーをviewmodelScopeで使用すると、すべての中断機能がこのディスパッチャーで実行されます。

これで、ViewModelはエグゼキュータ(実行をメインからバックグラウンドに変更するクラス)になります。

ViewModelのディスパッチャーを変更する場合は、コンストラクターによってこのDispatcherを挿入してViewModelをテストすることをお勧めします。

0
Manuel Mato