Androidの非同期通信処理はcoroutinesのasync, awaitが便利だった

Androidの非同期処理が結局何が便利なのか分からなかったので自作アプリを使っていろいろ試しました。
試した結果coroutieというライブラリが便利だったので備忘録に残します。

何がしたかったかというと、TwitMorseでつぶやき詳細画面を開いたときに、

返信元のつぶやきを表示したかたったのです。


そして完成したのがこちら!!


はい、もうモールス信号同士の会話でわけわからないと思いますが、これがやりたかったのです。

coroutines使用準備

app/build.gradle

dependencies {
.
.
.
    def coroutines_version = '0.26.1' //kotlinコルーチン用ライブラリ(async, await)のバージョン
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" //kotlinコルーチン用ライブラリ(async, await)
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" //kotlinコルーチン用ライブラリ(async, await)
}

gradle.properties

kotlin.coroutines=enable

非同期処理側

fun getRepliedText(tweetId: Long): Deferred<String?> = GlobalScope.async(Dispatchers.Default, CoroutineStart.DEFAULT, null, {
        try {
            val repliedId : Long = mTwitter!!.showStatus(tweetId).inReplyToStatusId
            return@async mTwitter!!.showStatus(repliedId).text
        } catch (e : TwitterException) {
            e.printStackTrace()
        }
        return@async StringUtil.EMPTY
    })
return@async mTwitter!!.showStatus(repliedId).text

ここのmTwitterは通信処理を行っています。この部分で非同期にtextを返します。

UIスレッド側

    /**
     * 返信元のツイートを表示する
     */
    private fun showRepliedTweet(tweetId: Long) {
        GlobalScope.launch(Dispatchers.Main, CoroutineStart.DEFAULT, null) {
            val repliedText = getRepliedText(tweetId).await() // ここがポイント
            val replied: TextView = findViewById(R.id.repliedText)
            replied.text = repliedText
            .
            .
            .
    }

GlobalScople.launch内のawait()メソッドで非同期処理側の結果を待ちます。
そして、待って得られた結果をTextViewにセットしてあげると、見事非同期処理からのUI更新が可能となります。

AsyncTaskのように非同期処理のコードが長くならないのがLGTMですね。
今後、こんなレベルの非同期処理はcoroutineを使っていこうと思います。

しかし、そろそろリファクタリングしたい。。。

参考資料

AndroidでKotlinのcoroutine(Async, Await)を使ってサクッとHTTP通信(非同期処理)を行う | Qiita


1 thought on “Androidの非同期通信処理はcoroutinesのasync, awaitが便利だった

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください