Callback形式はそのままだと、Coroutinesで手続き的に処理するのができません。それをうまくCoroutinesで扱えるようにする方法です。
サンプル例
例として、以下のようなインターフェースのものをCoroutinesで扱えるようにしてみます。
これを普通に使うと次のような感じです。
Callbackなので、成功したとき・失敗したとき、それぞれのメソッドが呼ばれます。これだけではCoroutinesでは扱いにくいので、これを対応します。
Coroutinesに対応する
対応方法はそんなに難しくなく、 suspendCoroutine
を使うことで対応できます。
拡張関数として、 suspendCoroutine
で囲んであげて、そこに渡される Continuation
の resume
または resumeWithException
を読んであげるだけです。
Coroutinesで実行する
あとは先程作った拡張関数を使うだけです。
失敗したときは例外が投げられるので try ~ catch で囲んで対応します。
まとめ
Callback形式でしか処理できないライブラリもこれを使えばCoroutinesに対応できるようになります。対応方法もそんなに難しくなく便利です。