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

この記事からわかること
- Android StudioのKotlin CoroutinesのCompletableDeferredの使い方
- 非同期処理の結果を待機する方法
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Meerkat
- Kotlin:2.0.21
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}")
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。