Kotlin Coroutines におけるリトライの実現方法を2つ考えてみる

台湾まぜそば、おいしいですよね。名古屋飯だそうです。台湾は?

f:id:bps_tomoya:20180419141045j:plain

つい先日、友人とのやりとりで Kotlin Coroutines を使うときにどのようにリトライを行うかについて深く考えていなかったという気付きがありました。

ということで、「Android アプリで画面の ImgeView にインターネットから取得した Twitter のアイコン画像を表示する」というケースでリトライ処理を考えてみました。

わざとリトライ処理に行ってほしいので、Twitter のアイコン画像の URL はあえて壊れた URL を指定しています。

リトライのメソッドを作って頑張ってみるパターン、RxJava 2 と連携させてみるパターンの2種類を書いてみました。

といっても、Coroutines のみで実装してみたパターンは、調べる過程ですぐに見つけた Stack Overflow のコードをそのままお借りしています。やっぱり、こういうことは先に考えている方がいらっしゃいます。

stackoverflow.com

リトライのメソッドを作って頑張ってみる

gist.github.com

try-catch がやや冗長になってしまうでしょうか。 単に Coroutines の使い方がヘタクソなだけかもしれませんが…。

RxJava 2 と連携させてみる

Kotlin Coroutines と RxJava 2 とを組み合わせるための道具が公式で提供されています。

github.com

これを使うと、こんな感じになりました。

gist.github.com

rxSingle() から返却されるのは io.reactivex.Single<T> ですから、その先は見慣れた RxJava 2 のコードです。 RxJava 2 だけを使うときと若干違うのは、ここでは Coroutines でスレッドを切り替えているので、RxJava 2 によるスレッド切り替えのコードが無いことでしょうか。

2つの案を考えてみましたが、個人的には後者が好みです。
Kotlin Coroutines が登場したことで RxJava 2 を使う機会は減るかな? と思っていましたが、まだまだお世話になりそうです。