【Kotlin/Android】RxJavaPluginsでUndeliverableExceptionをエラーハンドリング

この記事からわかること
- Android Studio/KotlinでRxJavaの使い方
- UndeliverableExceptionエラーのハンドリング
- RxJavaPluginsの使い方
\ アプリをリリースしました /
環境
- Android Studio:Meerkat
- Kotlin:2.0.21
UndeliverableExceptionエラーのハンドリング
RxJava
でonError
で適切にエラーハンドリングをしていてもUndeliverableException
エラーが発生するケースがありました。発生条件は詳しく特定はできなかったのですが調べてみるとどうやらUndeliverableException
エラーに限らずキャッチをすり抜けてしまうケースが存在するようです。
この動作が望ましいかどうかは議論の余地がありますが、いずれにしても、キャッチされない例外ハンドラーへのこのような呼び出しを回避するには、 RxJava 2 を (直接または推移的に) 使用する最終的なアプリケーションで no-op ハンドラーを設定する必要があります。
公式ドキュメントにはこのような例外への対処としてRxJavaPlugins
を使用したエラーキャッチを推奨していました。
RxJavaPlugins
RxJavaPlugins
はRxJavaの内部動作をグローバルにカスタマイズするためのユーティリティクラスです。このクラスはRxJavaのコード全てに影響するエラーハンドリングやロギングなどを実装することが可能になっています。そのためApplication#onCreate
などアプリ起動時に1回だけ呼ばれる箇所などに実装しておくことが推奨されています。
できること
- エラーハンドリング
- スケジューラーの変更
- ロギング
エラーハンドリング
エラーハンドリングを行うためにはsetErrorHandler
メソッドを使用します。これでonError
で捕捉できずにアプリがクラッシュしてしまっていた例外の発生を捕捉しハンドリングさせることが可能です。
スケジューラーの変更
スケジューラー(非同期処理の実行スレッド)をコントロールすることも可能になっています。例えばsetIoSchedulerHandler
ではIOスレッドを固定数のスレッドを持つスレッドプールを作成して指定したりすることができます。4
を指定した場合は最大4つは即実行され、残りはキューに溜まって順番待ちになります。
ロギング
setOnObservableAssembly
ではObservableの生成を観測することが可能です。ここにログなどを仕込んでおけば生成されている箇所を特定などに活用することができます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。