■RxJavaの特徴
- Observerパターンをうまく拡張している
- データの通知 + データストリームの完了の通知・エラー発生時の通知
- 非同期処理が行いやすい
- Observable契約というガイドラインにしたがって実装している限り、直接的なスレッドの管理がなくなり実装もシンプルになる
- 同期処理・非同期処理で実装方法が大きく変わらない
- 関数型プログラミングの影響を受けている
- 処理の多くを関数型インターフェースを受け取るメソッドを使って実現している
- 入力と結果のみ決めてあれば具体的な処理に関しては開発者に委ねられる
- 関数型プログラミングの原則に従うことで、処理の影響範囲を狭めることができ非同期処理の複雑さを回避できる
■非同期処理
-
RxJavaでは、開発者が直接スレッドを扱い管理をしなくて良いように、各処理の用途に合ったスレッド管理を行うSchedulerを用意している
-
そのSchedulerを指定することで、スレッドの制御ができる
-
Schedulerを指定できる箇所
1.生産者(Observable)
2.消費者(Subscriber) -
注意点
- 生産者から消費者までの処理を閉じた作りにする
- 外部の変数を参照した処理を行った場合、整合性が取れなくなるリスクがあるため
Flowable vs Observable
-
Flowableを使うケース
- 大量のデータ(10000件以上とか)を扱う場合
- ネットワークやDBなどのI/O処理を行う場合
-
Observableを使うケース
- GUIイベント
- 少量のデータ(1000件以下とか)を扱う場合
- データの処理が基本的には同期的でJava標準のStreamの代わりとして使う場合
-
補足
- FlowableよりObservableの方がオーバーヘッドが少ない
- 細かいレベルでのパフォーマンスが重要な場合はObservableの方が良さげ
- FlowableよりObservableの方がオーバーヘッドが少ない
■Single/Maybe/Completable
- 通知するデータが一件 or 一件未満の場合に利用するクラス
- Single -> 通知するデータが一件だけ確実にあるクラス
- Maybe -> 通知するデータが一件だけあるのかないのか不明なクラス
- Completable -> データを通知せず完了だけを通知するクラス
- 処理中にエラーが発生した場合、エラーを通知する
- データの通知を持って完了を意味する(onNext(),onComplete()がない。onSuccess()のみ。)
■非同期処理
-
subscribeOn()
- 生産者が処理を実行するスレッドを指定
- 一度しか設定できない
-
observeOn()
- 消費者が処理を実行するスレッドを指定
- 指定したスレッドで以降の処理を実行する
- 複数設定できる
-
Scheduler
- RxJavaで用意されているスレッドを管理するクラス
- io用、毎回新スレッド建てる用などいろいろある
-
flatMap()
- 受け取ったデータを元に再度生産者を生成し、そこで通知されたデータを結果として通知するオペレータ
- Singleだと関係ないが、Observableだと通知するデータが複数件あるため、出力順は保証されない