Kotlin
Arrow
arrow-kt
KotlinDay 12

RxJavaとCoroutineが混じったときのRetrofitで困ったあなたへ

Kotlin Advent Calendar 12日目の代打です。

最近Coroutineの話題が多いですね。

でもRxJavaもよく使いますね。

さてそうなってくると、「ここはCoroutineとして使いたい…あっちはRxのStreamとして使いたい…」というのがあると思います。


個人的な結論

ArrowのRetrofitAdapter使いましょう。

Arrowってなんやねん、という人は別のAdventCalendarにいくつか記事を投稿しているので、そちらを参考にしてください。


雑サンプルコード

// コンパイルすら通してないから、もしかしたらミスっているかもだが、雰囲気で察してくれ

interface Service {
@GET("/path/to/api")
fun get() : CallK<MyResponse>
}

// 中略

val res = retrofit.create(Service::class.java).get()

val useDeferred: DeferredK<Response<MyResponse>> = res.async(DeferredK.async()).fix()

val useSingleK: SingleK<Response<MyResponse>> = res.async(SingleK.async()).fix()

DeferredKはDeferredをDelegateしているので、そのままDeferredとして使えます。

SingleKはそうはなっていないので、他のStreamと混ぜたり、Subscribeする必要があるときはuseSingleK.singleのように利用すればOKです。

これで、RxとCoroutineがいりじまった場合にRetrofitの定義に困ることはありませんね、やったぜ!


reference

https://arrow-kt.io/docs/integrations/retrofit/

https://github.com/arrow-kt/arrow/tree/0.8.1/modules/integrations/arrow-integrations-retrofit-adapter