【Android開発】KotlinでもAsync/Awaitが使いたい!

今回はAndroid開発始めたてのポンコツエンジニアWiNtUがAsync/AwaitをKotlinで使った時のメモ書きを書いていこうかと思います。

いつもそうなのですが、開発系のアウトプットは自分が理解できればいいレベルで書かれているので分かりづらいと思った方はコメントして頂ければある程度補足します(できる範囲ですが…)

時代はAsync/Awaitだよな?

私は普段JavaScriptでサーバーサイド書いてるのですが、その時にめっちゃ乱用するのがAsync/Awaitです。Async/Awaitは知っての通り非同期処理を待ってくれるやつです。Androidの場合だとAPI通信処理は非同期で行いたまえ…!! となっており、メインスレッドで行うととができません。(もし出来たら通信中アプリフリーズしちゃう…)

通常であればandroid.os.AsyncTaskを利用して非同期処理が書けます。これの代わりにいい感じに書けるのがAsync/Awaitです。

とりあえず実装しちゃおう!

多分言葉で説明しても私は理解出来ないタイプなのでコード書いていきましょうw まずはライブラリーを追加していきます。「build.gradle」のdependenciesに以下の二つを追加してください!

 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:0.22.5"
 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5"

これでAsync/Awaitが利用できるようになります。これで準備完了です!

それではまず、非同期処理を定義していきましょう! JavaScriptで例えるとconst hoge = new Promise((resolve, reject) => {})の部分ですね! Defferredには戻り値の型を定義しましょう!

fun hogehoge(): Deferred<String> = async(CommonPool) {
        // ここに非同期処理を書く
        // 非同期処理の結果を返す(JSだとResolve())
        [email protected] "hogehoge"
}

これで非同期処理を定義できましたので早速使っていきましょう!! 使い方はめちゃめちゃ簡単ですw

launch(UI) { 
  val hoge = hogehoge().await()
}

これだけです。ね、簡単でしょ? 一応補足すると、このlanch(UI)で囲われた部分は別スレッドでの実行になります。なので非同期処理した後に何か処理したい場合はcallback的な関数を定義して以下のように書いちゃえばいい感じの動きになるかと思います。

fun isHoge(str: String): Boolean {
  return if (str == "hogehoge") true else false
}

launch(UI) {
  hogehoge().await()?.let {
    isHoge(it)
  }
}

関数定義せずにlanch(UI)の下に書いても別スレッドなので先に下の処理が実行されてしまうのでご注意です!!

あとがき

めちゃめちゃ簡単に非同期処理が出来てしまったので、Android書くのが楽しくなってきましたw この記事では詳しくは触れていませんので、詳しく知りたい方は公式ドキュメントを覗いてみて下さい!

コメントを残す