README.md
DevelopRx
RxJavaの基本的な構成
- RxJavaの基本的な構成は生産者(Flowable/Observable)が消費者(Subscriber/Observer)に購読(subscribe)される形で成り立っている
- Flowable/Observable
- データを生産し通知するクラス
- FlowableとObservableの違いは、Flowableにはバックプレッシャーの機能があり、Observableには無い
- Subscriber/Observer
- 通知されたデータを受け取りそのデータを使った処理を行うインターフェース
- Subscriberにはバックプレッシャーの機能があり通知するデータ数をリクエストしないといけないのに対し、Observerはバックプレッシャーの機能が無いため、データ数の制限無しにデータが通知されることがある
- Subscription
- Reactive Streamsで定義されているインターフェースで通知するデータの数をリクエストするrequestメソッドと処理の途中でも購読を解除するcancelメソッドを持っています
- Disposable
- 購読を解除するためのメソッドを持つインターフェース
- ObservableとObserver間の購読の際にonSubscribeメソッド経由で購読を処理の途中でも解除することができます
- RxJavaの拡張モジュール
- RxAndroid:Androidで使うスレッドを管理するSchedulerを持つ
- RxLifecycle:AndroidのActivityやFragmentをRxJavaのFlowableやObservableのライフサイクルと同期する
オペレータ内で生成される非同期のFLowable/Observable
- flatMap()
- データを受け取ると、新たにFlowable/Observableを生成して実行し、そこで通知されたデータを結果として通知するオペレータ
- 受け取るデータが連続してくるような場合、生成したFlowable/Observableが同時に実行され、それぞれがデータを通知したタイミングで結果としてデータを通知するので、最終的に通知されるデータは受け取った順に実行されるとは限らない
- concatMap()
- flatMapと違う点は、受け取るデータが連続してくるような場合、最終的に通知されるデータは順序通り
- 1つのデータの処理に時間がかかる場合は、処理が終わるまで次のFLowable/Observableを生成しない
- concatMapEager()
- flatMapと違う点は、受け取るデータが連続してくるような場合、最終的に通知されるデータは順序通り
- 1つのデータの処理に時間がかかる場合は、全て違うスレッドで実行の後に生成されたデータがバッファされる
リソース管理
- using()
- Observable.using()
- リソースの取得、リソースから取得したデータを使ったFLowable/Observableの生成、リソースの解放を行うインターフェースが用意されている
RxJavaのバックプレッシャー
- Flowableにのみ用意されており、Observableにはない
- この機能が必要になるケースはFlowableとデータを受け取る側が異なるスレッド上で処理を行い、通知する処理スピードがデータを受け取る側の処理スピードより速い場合
- request()
- SubscriberがonSubscribe()で受け取るSubscriptionの、Flowableがデータを何件まで通知するかをリクエストするメソッド
- 1回目はonSubscribe()で通知されるデータ数のリクエストを行い、2回目以降はonNext()で処理を行った後に再度データ数のリクエストを行う
- 1回目のonSubscribe()でrequest(Long.MAX_VALUE)とした場合は、通知するデータ数の制限がなくなり、生成されたデータは全て通知されるようになるため、onNext()でリクエストは不要となる
- observeOn()
- scheduler:Scheduler, delayError:boolean, bufferSize:intを設定することが出来る
- デフォルトでbufferSizeは128となっているため、バッファされるデータが128個を超えるとMissingBackpressureExceptionが起きる
- BackpressureStrategy
- Flowableがどのように通知待ちのデータを扱うかのバックプレッシャーの種類
- create()でFlowableを生成する際の第2引数にBackpressureStrategyを指定する
- 種類
- BUFFER:通知されるまで、全てのデータをバッファする
- DROP:データを通知できるようになるまで、新たに生成されたデータを破棄する
- LATEST:生成した最新のデータのみをバッファし、生成される度にバッファするデータを置き換える
- 通知待ちのデータのバッファサイズを超す場合はMissingBackpressureExceptionのエラーを通知する
- 特定の処理を行わない。主にonBackpressureで始まるメソッドを使ってバックプレッシャーのモードを設定する場合に使われる
通知する際のルール
- nullを通知してはならない
- データの通知は行っても行わなくても良い
- Flowable/Observableの処理を終了する際は完了かエラーの通知のどちらか一方を行わないといけない。両方を通知することはない
- 完了かエラーの通知を通知をした後は他の通知を行ってはいけない
- 通知をする際は1つずつ順番に行い同時に行ってはいけない