【Android/Kotlin Coroutines】CompletableDeferredの使い方!非同期結果の待機

【Android/Kotlin Coroutines】CompletableDeferredの使い方!非同期結果の待機

この記事からわかること

  • Android StudioKotlin CoroutinesCompletableDeferred使い方
  • 非同期処理結果待機する方法

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

CompletableDeferred

公式リファレンス:CompletableDeferred

CompletableDeferred非同期結果を制御するためのクラスです。コールバックで結果が取得できる既存の処理などをCoroutinesで扱えるようにすることができるようになります。

使い方のイメージとしては以下のようにコールバック実行前にインスタンス化し、コールバックの結果を取得したタイミングで通知、待機させていた箇所が動作をし始めるといった感じです。

suspend fun fetchDataAsync(): String {
    // コールバックの結果が完了するまで待機させるためのCompletableDeferred
    val deferred = CompletableDeferred<String>()

    // コールバック処理を実行
    fetchDataFromCallback { result, error ->
        if (error != null) {
            // 結果(エラー)を通知
            deferred.completeExceptionally(error)
        } else {
            // 結果(成功)を通知
            deferred.complete(result)
        }
    }
    // 完了 or エラーが流れるまで待機して、通知が来たら動作
    return deferred.await()
}

// 呼び出し側
try {
    println("待機中...")
    val result = fetchDataAsync()
    println("結果: $result")
} catch (e: Exception) {
    println("エラーが発生しました: ${e.message}")
}

このようにコールバック → コルーチンに変換することができるのがCompletableDeferredの大きなメリットです。

メソッド / プロパティ 概要
complete 完了通知
completeExceptionally エラー通知
await 完了/エラー通知を待機
isCompleted 完了しているかどうか
isCancelled キャンセルされたかどうか

キャンセルする

CompletableDeferredをキャンセルするにはcancelメソッドを使用します。引数にはCancellationException型でキャンセル理由などを渡すことが可能です。

deferred.cancel(CancellationException("ユーザーがキャンセルしました"))

キャンセルもエラーをキャッチしてハンドリングします。

try {
    println("待機中...")
    val result = fetchDataAsync()
    println("結果: $result")
} catch (e: CancellationException) {
    println("キャンセルされました: ${e.message}")
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

Search Box

Sponsor

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article