モード変更


    言語

Kotlin async/await

2021/12/03

今回は、Androidの非同期処理をKotlin Coroutineで簡単に行えるasync/awaitについて紹介します。 async/awaitがよく使われるケースは、例えば、詳細情報を取得するAPIと付加情報を取得するAPIを、Coroutineで処理した内容が終わったタイミングで待ち合わせて、詳細ページを作成します。

まず、asyncとはCoroutineを起動する関数の一つです。 基本的にlaunchと同じ。違いは、値を返すかになります。 値は、Deferred型です。Deferred型とは、返却値はfuture promiseになります。つまり、 Coroutineの処理が終わったタイミングで戻り値を取得します。

fun <T> CoroutineScope.async(context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> T): Deferred<T>

値が必要になったらawait()を呼び出します(ブロッキングコール) 値が利用可能であれば、すぐに返されます。 値が得られない場合は、得られるまでスレッドを一時停止します。

下記は、Coroutine で処理した内容が終わったタイミングで待ち合わせて、ランダム値の合計を返す例になります。簡単に説明すると、最初に2秒間後ランダム値を取得して、 次に3秒間かけてランダム値を取得します。その結果を待ち合わせして、合計値を算出したケースになります。つまり、getValueByAPI2と合わして並列に実行されてMax(1秒, 2秒, 3秒)で約3秒で実行されます。

サンプル:

import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis

fun main() {
    var time = measureTimeMillis {
        runBlocking {
            val firstDeferred = async { getValueByAPI1() }
            val secondDeferred = async { getValueByAPI2() }

            println("Doing some processing here")
            delay(1000)
            println("Waiting for values")

            val firstValue = firstDeferred.await()
            val secondValue = secondDeferred.await()

            println("The total value is ${firstValue + secondValue}")
        }
    }
    println("The total time (API1 + API2): ${time/1000.0}s")
}

suspend fun getValueByAPI1(): Int {
    delay(2000)
    val range = (1..1000)
    val value = range.random()
    println("Return value $value from API1")

    return value
}

suspend fun getValueByAPI2(): Int {
    delay(3000)
    val range = (1..1000)
    val value = range.random()
    println("Return value $value from API2")

    return value
}

出力結果:

Doing some processing here
Waiting for values
Return value 29 from API1
Return value 987 from API2
The total value is 1016
The total time (API1 + API2): 3.118s

次回は、Gradleを使ったプラグインの作成をやります。

android

Author

Teruhiko Tanaka

Teruhiko Tanaka

Senior Android Developer

passion for Kotlin

その他おすすめ記事

2026/07/07

FastAPI × Diffusers でローカル完結の「顔属性変換」学習アプリをつくる

生成 AI を「使う」だけでなく「アプリに組み込む」とどうなるのか。これを手を動かして理解したくて、人物写真をアップロードすると顔の属性(性別的な見た目)だけを別の性別に変換する学習用 Web アプリを個人で作りました。外部の画像生成 API には一切頼らず、推論まですべてローカルで完結させているのが特徴です。本記事では、その構成と実装上の判断、つまずいた点を技術寄りに整理して共有します。 なぜ「ローカル完結」にこだわったのか 顔写真は最もセンシティブな個人データのひとつです。学習目的とはいえ、自分や知人...

Ryuji Takano

Ryuji Takano

Machine Learning

2026/06/30

AIで生演奏のピッチ検出を試してみた

さて。このAI全盛期、我が社でも例に漏れずAIをうまく使っていこうという流れがきているため、AIを使った技術の検証をしてみようと思います。 どうせなら自分に身近なテーマを、ということで長らく趣味で習っているヴァイオリンのピッチ判定ができたら面白そうです。 調べてみたところいくつか使えそうなAIモデル(CREPE、Basic Pitch)があったため使えるか検証していきます。 また、比較用としてAIを使っていない従来の方式のaubioも試してみましょう。 はてさて、全てうまく動くでしょうか...。 環境構...

Mayumi Ishiyama

Mayumi Ishiyama

Machine Learning

サービス開発実績会社情報
採用情報インサイトお問い合わせ
© 2022 Monstarlab
情報セキュリティ基本方針個人情報の取り扱いについて個人情報保護方針