非同期処理のCoroutine(コルーチン)を始めてみよう!【Android/Kotlin】



いよいよ非同期処理もCoroutine(コルーチン)へ移行しようと思っているので理解できている範囲で使い方をまとめておく。





非同期処理のコルーチンを可能にするライブラリのインストール


Androidアプリでコルーチンを使えるようにするためにGradleでインストールする。

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'





ScopedAppActivityクラスの作成


公式ドキュメントにあるようにAppCompatActivityを継承したScopedAppActivityクラスを作る。
» kotlinx.coroutines/coroutines-guide-ui.md at master · Kotlin/kotlinx.coroutines · GitHub



次のようにしてコルーチンを使うアクティビティでScopedAppActivityを継承するようにする。


これにより、onDestroyでコルーチンのJobキャンセルし忘れがなくなり、記述も簡潔に書けるようになる。




launchを使う



新しいコルーチンを起動するためにはこのようにlaunchを使う。引数を指定していないのでブロック内はメインスレッドとなる。
またdelayはコルーチンを中断する関数で次のようにsuspendで定義されている。







コルーチンで非同期処理を書く



asyncを使って非同期処理を書く。awaitを使うことで実行結果を待つことが出来る。UIにアクセスする場合はwithContext(Dispatchers.Main) ブロック内に書くこと。ただし上記の場合はwithContext(Dispatchers.Main)の記述が無くても問題なく動く。asyncブロック内の最後の行が戻り値となる。returnをつけてはいけないことになっている。




suspend関数


コルーチンのasyncを使った非同期処理の部分を関数に移したい場合はsuspendを使う。




asyncを使わずwithContextを使って書く。


先程のプログラムは次のようにも書ける。asyncを使った場合との厳密的な違いはわからない。suspendとwithContextを使ったこちらのほうが個人的には分かりやすいと思っている。




View.onClickを拡張する




のようにlaunchの記述がいちいち面倒な場合はサンプルドキュメントのようにView.onClickを拡張してしまう。



するとこのようにシンプルに書けるようになる。




ここまでのMainActivityのまとめ


ここまでのサンプルソースを載せておこう。






suspend内のコルーチンのキャンセル


ベストプラクティスかどうかはわからないが、CoroutineScopeをメンバ変数に保持してcancelTaskを呼び出することでキャンセルさせることが出来る。



キャンセルされたら例外が投げられるのでそれをフックする。ただし非同期処理でOkHttpの処理を書いてみたがOkHttpはキャンセルされなかった。その場合はOkHttpのCallをキャンセルさせたほうが良さそうだ。



Kotlinプログラミング

Kotlinは、Javaとの相互運用を可能にし、Android OSでGoogleがフルサポートする静的型プログラミング言語です。この言語は、Javaだけでは十全ではない(Javaだけでは実装に手間がかかりすぎる)、軽量かつ豊かな表現形式や、他言語ではすでに実装されている最新の機能を盛り込んでいます。

KindleAmazon

基本からしっかり身につくAndroidアプリ開発入門

圧倒的な多数のユーザーが使っているヤフーのアプリ。その制作の最前線にいる黒帯エンジニアが、ユーザーが使いやすいアプリの大切な基本をしっかりと解説します。

KindleAmazon



参考


» Basics - Kotlin Programming Language
» kotlinx.coroutines/coroutines-guide-ui.md at master · Kotlin/kotlinx.coroutines · GitHub



あなたにおすすめ