【Kotlin/Android】RxJavaのretryやretryWhenの使い方!エラー時の再試行

この記事からわかること
- Android Studio/KotlinでRxJavaの使い方
- retryやretryWhenメソッドの違いと使い方
\ アプリをリリースしました /
環境
- Android Studio:Meerkat
- Kotlin:2.0.21
- Android OS:15以降
エラー発生時に処理をリトライしたい場合
RxJavaでストリームにエラーが発生した場合に処理をリトライするにはretry
やretryWhen
を使用します。エラーハンドリングするだけであればdoOnError
やonErrorReturn
でも可能です。
おすすめ記事:【Kotlin/Android】RxJavaのdoAfterTerminateやdoOnErrorなどの使い方!
- retry・・・エラーが発生した場合にそのまま再試行を行う演算子
- retryWhen・・・エラーが発生した際にそのエラーを受け取り、新しいObservableを生成して再試行
retryメソッド
retry
はストリームにエラーが発生した場合にストリームを最初から再試行するメソッドです。Observable
やSingle
、Completable
など基本的にほとんどのストリーム生成するクラスで使用することが可能です。以下の場合は1、2
が流れた後にエラーを発生させています。
retry
の引数には再試行したい回数か条件(後述)を渡します。再試行回数を指定しない場合は無限回のリトライになります。retry
より下流にあるメソッドは実行されなくなるのでエラーが流れても12行目のdoOnError
は動作しません。
出力
flatmapなどでは呼び出し位置に注意
retry
や後述のretryWhen
メソッドは呼び出した箇所から上流部分を再試行します。そのためflatmap
などで連結している場合は呼び出す位置によって再施行される範囲が変わってくるので注意してください。
例えばflatmap
の後に設置した場合はflatmap
内でエラーが発生しても最初のObservable.just(1)
から処理が再施行されます。
そのためapi.getData
だけを再施行したい場合は以下のようretry
メソッドを設置します。
エラーの種類によってリトライ条件を変更する
発生したエラーの種類によってリトライしたい場合としたくない場合が分かれることは多いと思います。例えば以下のように独自のエラー型を定義しておりそのエラーが流れた時だけリトライさせることも可能です。
再試行させるためのエラー分岐処理はretry
メソッドにラムダ式を渡しその引数から以下の2つを参照できます。
- 1つ目:現在のリトライ回数を示す整数
- 2つ目:発生したエラー(例外)
あとは取得したエラーが期待するものであるかどうかを識別してfalse
を返せば再試行をせず、true
を返すと再試行してくれます。
retryWhenメソッド
同じような再試行を行うメソッドにretryWhen
があります。retryWhen
は受け取ったエラーをObservable / Flowableとして受け取り、最終的に新しいObservable / Flowableを生成することで再試行を制御しています。そのためretryWhen
の中でストリームを操作するような処理(遅延や条件分岐など)を行うことができます。また記述していますがObservable
またはFlowable
でしか使用できません。
例えばretryWhen
を使用してストリームの再試行に2秒間のディレイを設けつつ、最大3回に制限したい場合は以下のように実装します。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。