##はじめに
AndroidではCoroutinesが大分浸透してきたので、掘り下げてみたいなと思います。
とはいえ非同期プログラミングの話になると、結構??なワードが出てきてコードの理解の妨げになります。
ここでは、Coroutinesにまつわるワードを一覧とその解説によってその悩みを解消する記事にしたいと思います。
##Coroutinesって?
Androidでは、お馴染みの並行した実行処理を実現するデザインパターンです。
Kotlinが言語レベルでのサポートをしてくれています。
これによりUIスレッドから切り離して重めの処理を行い、ブロッキングを回避することができます。
##関連キーワード一覧
###スレッド
処理の「流れ」。
深ぼり過ぎると二度とこの世に戻ってこれないので、これくらいに留めておくのが良い・・
###Coroutines
「流れ」
リファレンスには、一時停止可能な計算のインスタンスとあります。
スレッドとは似たものではありますが、違うもののようです。
ただ、イメージとしてはスレッドと考えて良い気はします。
後ほど説明しますが、コルーチンは coroutineScope
内で起動します。
###ブロック
「止める」
スレッドの処理を止めること。
###suspend
「一時停止」
コルーチンが利用可能なマーク。
コルーチンが、呼び出すと戻り値が返ってくるまで、一時停止してくれる。
その間にスレッド(流れ)は、止めることなく進みます。
その際に、ローカル変数を保存してくれます。
そのため、無事に結果が返ってくると、処理を再開することができます。
下記はcodelabのコードを拝借しています。
// Slow request with coroutines
@UiThread
suspend fun makeNetworkRequest() {
// slowFetch is another suspend function so instead of
// blocking the main thread makeNetworkRequest will `suspend` until the result is
// ready
val result = slowFetch()
// continue to execute after the result is ready
show(result)
}
// slowFetch is main-safe using coroutines
suspend fun slowFetch(): SlowResult { ... }
slowFetch
が、呼び出しと同時に一時停止され、result
に値が格納されるまでshow
は実行されません。
###launch
「起動」
Coroutine Builder。
現在のスレッドをブロックすることなく、同時にコルーチンを生成し、独立して処理を続けます。
戻り値は、後ほど説明しますが Job
を返します。
fun doCoroutines = coroutineScope {
launch {
delay(1000)
print("in coroutine")
}
print("Ends before the above")
}
###async
「起動」
こちらもコルーチンを実行するメソッドです。
launch
との違いは、戻り値が Differred
であることです。
つまり、async
は値を返すことができ、launch
は逆に出来ないです。
###delay
「一時停止」
こちらもsuspend機能と同じで、自身のコルーチンを引数に渡した時間分、意図的にブロックします。
###runBlocking
「仲介」
通常スレッドとコルーチンとの仲介を担い、リソースの共有をするブロック。
コルーチンは、特定のスレッドに紐づいていないので、この役割が必要なのです。
また、後ほど説明しますがこのスコープ内で coroutineScope
としコルーチンを実行できるようにします。
ただ、名前から分かるように使用してるsuspend
関数による停止中、現在のスレッドをブロックします。
そのため、一時停止中にスレッドを解放してくれる coroutineScope
の方がよい。
fun doSomething = runBlocking {
launch {
print("stop current thread")
delay(1000)
}
}
###キャンセル
「中断」
よく「コルーチンをキャンセルする」と表現されるものは、実行中のコルーチンを中断することを意味しています。
不要になった通信を中断して、リソースの節約に繋げるなどします。
###CancellationExeception
suspend
関数の機能で、コルーチンが一時停止中にキャンセルされた場合 throw
してくれます。
###CoroutineScope
「追跡」
コルーチンが最初から最後までの処理が完了するまで、追跡をします。
またこれにより、cancel()
でいつでも実行をキャンセルすることが出来ます。
そして、現在使用しているスレッドをブロックせずに一時停止します。
###構造化された同時実行
こちらは、CoroutineScope内でのみコルーチンが起動するので、見失うことがなく、メモリリークに繋がらない作りを表現した言葉です。
###Job
「状態」
こちらは、コルーチンの実行状態に関する情報を持ちます。
launch
とasync
は、作成したコルーチンを一意に識別します。
そして、launch
に関しては、コルーチンのライフサイクルを管理するインスタンスを返します。
それが、Job
です。
###Dispathers
「割り当て」
コルーチンをどのスレッドに割り当てるのかを決定します。
###Dispatchers.Main
Diapatersによって割り当てることのできるスレッドの一つで、こちらはUIの更新を行う時に指定するのが良いです。
###Dispatchers.IO
Roomなどのディスクの操作や通信処理に適しているスレッドです。
###Dispatchers.Default
負荷の高い処理に適しているスレッドです。
###CoroutineContext
「情報」
コルーチンに関する情報を持ちます。
色々含まれているのですが、Job
とDispather
が含まれます。
###withContext()
「切り替え」
コルーチンを新しく作ることなく、一度だけDispathers
のみを切り替えることが出来ます。
##おわりに
辞書的な記事にしたいと思うので、何か見つけたら追記しようと思います!
誰かの役に立てればよいです!
また、間違っているものがあれば、優しく教えてほしいです!
##参考
https://kotlinlang.org/docs/coroutines-guide.html