【Kotlin】コルーチンに触れてみる


こんにちは、kiyokawaです。
10月30日にKotlin1.3がリリースされ、ついにコルーチンが正式採用となりました。
コルーチンを使うことで非同期処理を簡単に分かりやすく記述できます。
とりあえず触ってみました。

導入方法

コルーチンはライブラリとして用意されているので、まずはapp配下のgradleに以下を追加します。

使い方

まずは、一番簡単なコルーチンの起動方法です。

これだけで、コルーチンを起動することが出来ます。
実行するスレッドはlaunchの引数にDispatcherを渡すことで指定できます。

早速launchでコルーチンを起動し使ってみます。

実行結果はこうなります。

何故なら、コルーチンは処理をブロックしないため、コルーチン内の処理が走る前に呼び出し側が終了してしまったからです。
以下のように、runBlockingを使うことで処理の中にsuspend関数として用意されているdelay関数を使い処理を待つことで順番に出力されます。

ただ、このrunBlockingは現在のスレッドをブロックします。
またこちらはmain関数やテストへの橋渡しとして用意されているようなので、普段使いすることは避けたほうがよさそうです。

コールバックを置き換える

コルーチンはlaunchの他にasyncというものも用意されています。
違いとしては、launchは戻り値を持たず、asyncは戻り値を持っているということです。
使い方としては以下のような感じになるかと思います。

asyncを使い重い処理を非同期で行いawaitで取得することもできますが、既存ソースはだいたい非同期処理の結果はコールバックで受け取っていると思います。
非同期処理も、拡張関数としてsuspend関数(中断可能な関数)を用意してあげれば関数の利用側ではコールバックを使わずに書くことが出来ます。

上のように定義することで利用側は以下のようになります。

コールバック分のネストが減って分かりやすくなりました。
今はコールバックが一つなので威力が伝わりにくいかも知れませんが、コールバックのネストがあるところなどでは一気にスッキリします。
一つ注意点があり、suspend関数はsuspend関数内もしくはコルーチン内でしか呼ぶことが出来ません。

触ってみて

コルーチンを実際に触れてみて、理解が足りない部分もまだまだありますがコールバック地獄を解消していくのは気持ちよく、コードの見通しも良くなりました。
コルーチンを使えばAndroid開発で面倒なパーミッションリクエストなども同期的に書けるようになります。
最近は非同期処理はほとんどRxJava2を使って書いていますが、少しずつコルーチンも取り込んでみようかなと思いました。