デバッグ用のオペレータ(1)
ユーティリティ系のオペレータの中には「do」で名前が始まるいくつかのオペレータがあります。これらは各通知時に実行され、引数には戻り値がない(void)関数型インターフェースを受け取るようになっています。つまり、これらのオペレータは各通知時に何らかの副作用(オブジェクトの状態を変えたり、生産者―消費者間の外部に影響を与えたりすること)を起こすことを意味します。しかし、RxJavaでは基本的に受けとったデータを使って副作用を起こすことは消費者側で行うことを前提としています。
しかし、さまざまなオペレータを経由しているFlowable/Observableの場合、途中でデータにアクセスできないと、元のデータがどのように変更しているのかを把握することが難しくなり、また、オペレータ内でデータを使って何らかの処理をしているコードの中で、デバッグのためのログを出力するような実装を入れることは、あまり好ましいことではありません。そこで、この「do」で名前が始まるオペレータを使って、各通知が行われる際にログを出力するようにすることで、ビジネスロジックを行うコードとデバッグを行うためにログを出力するコードを分割することができるようになります。ここでは、このような「do」で名前が始まるメソッドの中から代表的なものとして次のものを見ていきます。
- doOnNext
- doOnComplete
- doOnError
- doOnSubscribe
- doOnRequest
- doOnCancel/doOnDispose
ちなみに、これらのオペレータをビジネスロジックとして使うことは可能ですが、本来は消費者側で行えることをこれらのオペレータで行うことは単に複雑さを増すことになるため、基本的にはビジネスロジックに影響を与えるような使い方は避けたほうが良いでしょう。
また、ここでは、これらのオペレータのマーブルダイアグラムを公式のJavaDocのものから変えているので、わかりづらい場合は公式のJavaDocも参照してください。
doOnNext
メソッド
-
doOnNext(Consumer<? super T> onNext)
doOnNextメソッドはFlowable/Observableがデータを通知する際に、引数に指定した関数型インターフェースの処理を行わせるメソッドです。実装する、関数型インターフェースのメソッドの引数に通知するデータが渡されるため、どのようなデータを受け取ったのかを確認することが可能です。
doOnComplete
メソッド
-
doOnComplete(Action onComplete)
doOnCompleteメソッドはFlowable/Observableが完了を通知する際に、引数に指定した関数型インターフェースの処理を行わせるメソッドです。実装する、関数型インターフェースのメソッドの引数には何も渡されません。
doOnError
メソッド
-
doOnError(Consumer<? super Throwable> onError)
doOnErrorメソッドはFlowable/Observableがエラーを通知する際に、引数に指定した関数型インターフェースの処理を行わせるメソッドです。実装する、関数型インターフェースのメソッドの引数には通知するエラーオブジェクトが渡されるため、どのようなエラーオブジェクトを受け取ったのかを確認することが可能です。
doOnSuscribe
Flowableのメソッド
-
doOnSubscribe(Consumer<? super Subscription> onSubscribe)
Observableのメソッド
-
doOnSubscribe(Consumer<? super Disposable> onSubscribe)
doOnSubscribeメソッドはFlowable/Observableが購読されて処理を開始する準備ができた際に、引数に指定した関数型インターフェースの処理を行わせるメソッドです。消費者(Subscriber/Observer)のonSubscribeメソッドを呼ぶ際に実行されます。実装する、関数型インターフェースのメソッドの引数にFlowableの場合はSubscription、Observableの場合はDisposableが渡され、これが最終的にSubscriberのonSubscribeメソッドに渡されます。
doOnRequest
メソッド
-
doOnRequest(LongConsumer onRequest)
doOnRequestメソッドはFlowableがデータ数をリクエストされた際に、引数に指定した関数型インターフェースの処理を行わせるメソッドです。実装する、関数型インターフェースのメソッドの引数には、リクエストしたデータ数が渡されるので、リクエストしたデータ数を確認することが可能です。また、このメソッドはバックプレッシャー機能がないObservableにはありません。