台湾まぜそば、おいしいですよね。名古屋飯だそうです。台湾は?
つい先日、友人とのやりとりで Kotlin Coroutines を使うときにどのようにリトライを行うかについて深く考えていなかったという気付きがありました。
ということで、「Android アプリで画面の ImgeView にインターネットから取得した Twitter のアイコン画像を表示する」というケースでリトライ処理を考えてみました。
わざとリトライ処理に行ってほしいので、Twitter のアイコン画像の URL はあえて壊れた URL を指定しています。
リトライのメソッドを作って頑張ってみるパターン、RxJava 2 と連携させてみるパターンの2種類を書いてみました。
といっても、Coroutines のみで実装してみたパターンは、調べる過程ですぐに見つけた Stack Overflow のコードをそのままお借りしています。やっぱり、こういうことは先に考えている方がいらっしゃいます。
リトライのメソッドを作って頑張ってみる
try-catch がやや冗長になってしまうでしょうか。 単に Coroutines の使い方がヘタクソなだけかもしれませんが…。
RxJava 2 と連携させてみる
Kotlin Coroutines と RxJava 2 とを組み合わせるための道具が公式で提供されています。
これを使うと、こんな感じになりました。
rxSingle()
から返却されるのは io.reactivex.Single<T>
ですから、その先は見慣れた RxJava 2 のコードです。
RxJava 2 だけを使うときと若干違うのは、ここでは Coroutines でスレッドを切り替えているので、RxJava 2 によるスレッド切り替えのコードが無いことでしょうか。
2つの案を考えてみましたが、個人的には後者が好みです。
Kotlin Coroutines が登場したことで RxJava 2 を使う機会は減るかな? と思っていましたが、まだまだお世話になりそうです。