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

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

この記事からわかること

  • Android Studio/KotlinRxJava使い方
  • UndeliverableExceptionエラーハンドリング
  • RxJavaPlugins使い方

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

UndeliverableExceptionエラーのハンドリング

RxJavaonErrorで適切にエラーハンドリングをしていてもUndeliverableExceptionエラーが発生するケースがありました。発生条件は詳しく特定はできなかったのですが調べてみるとどうやらUndeliverableExceptionエラーに限らずキャッチをすり抜けてしまうケースが存在するようです。

この動作が望ましいかどうかは議論の余地がありますが、いずれにしても、キャッチされない例外ハンドラーへのこのような呼び出しを回避するには、 RxJava 2 を (直接または推移的に) 使用する最終的なアプリケーションで no-op ハンドラーを設定する必要があります。

引用:RxJava error-handling

公式ドキュメントにはこのような例外への対処としてRxJavaPluginsを使用したエラーキャッチを推奨していました。

RxJavaPlugins

RxJavaPluginsRxJavaの内部動作をグローバルにカスタマイズするためのユーティリティクラスです。このクラスはRxJavaのコード全てに影響するエラーハンドリングやロギングなどを実装することが可能になっています。そのためApplication#onCreateなどアプリ起動時に1回だけ呼ばれる箇所などに実装しておくことが推奨されています。

できること

エラーハンドリング

エラーハンドリングを行うためにはsetErrorHandlerメソッドを使用します。これでonError捕捉できずにアプリがクラッシュしてしまっていた例外の発生を捕捉しハンドリングさせることが可能です。

RxJavaPlugins.setErrorHandler { throwable ->
    Log.e("RxError", "未処理エラー: ${throwable.message}", throwable)
}

スケジューラーの変更

スケジューラー(非同期処理の実行スレッド)をコントロールすることも可能になっています。例えばsetIoSchedulerHandlerではIOスレッドを固定数のスレッドを持つスレッドプールを作成して指定したりすることができます。4を指定した場合は最大4つは即実行され、残りはキューに溜まって順番待ちになります。

RxJavaPlugins.setIoSchedulerHandler {
    Schedulers.from(Executors.newFixedThreadPool(4))
}

ロギング

setOnObservableAssemblyではObservableの生成を観測することが可能です。ここにログなどを仕込んでおけば生成されている箇所を特定などに活用することができます。

RxJavaPlugins.setOnObservableAssembly { observable ->
    Log.e("RxLog", "Observable created: $observable")
    observable
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article