CoroutineScopeをざっくりと説明
コルーチンを起動するには、どのスコープで起動するかを指定する必要があります。このスコープこそがCoroutineScopeです。
コルーチンビルダーはCoroutineScopeの拡張関数
コルーチンを起動するにはコルーチンビルダーを使用します。このコルーチンビルダーにはlaunch()
やasync()
といった関数が存在しますが、これらはすべてCoroutineScopeの拡張関数として定義されています。
そしてすべてのsuspend関数はコルーチンで実行しないといけないので、普段ViewModelでsuspend関数を呼び出し、UiStateを更新する場合は次のように書いたりします。
viewModelScope.launch {
val result = repository.getActivities()
viewModelState.update {
it.copy(
...
)
}
}
スレッドとかwithContextって何?
コルーチン内で、特定の処理を実行するときにコルーチンが起動されたときに指定されたスレッドとは別のスレッドに切り替えて処理を実行したい場合にはwithContext()を使用します。
viewModelScope.launch {
...
withContext(Dispatchers.IO) {
...
}
}
コルーチンで使用できるスレッドの種類
Kotlinのコルーチンでは、ディスパッチャを使ってコルーチンの実行時に使いたいスレッドを指定します。
以下では、主な3つのディスパッチャを紹介します。
Dispatachers.Main
Dispatachers.Main
はメインスレッドを表します。メインスレッドで、手早くsuspend関数を呼び出したりUIのオペレーションを実行したい場合にのみ便利です。
Dispatchers.IO
Dispatachers.IO
では、デフォルトで64スレッド存在するため、最大64スレッドの並列実行を行うことが可能となります。
しかし、名前の通り、IOがブロックされることにより多くの待ち時間が発生する可能性があります。
Dispatachers.Default
Dispatachers.Default
は、メインスレッドの外部で、負荷の高い処理や、一極集中型のタスクを実行したい場合に向いています。しかし、実行端末のCPUのコア数の数のスレッドしか起動することはできないため注意が必要です。ただ、スリープはほとんど発生しないため、そういったメリットもあります。
参考にした記事