前回はRxJavaの概要についてまとめました(記事はこちら)。今回はRxJavaの構成をまとめてみます。
FlowableおよびObservableはデータを生産し通知するクラス
FlowableとObservableの違いは、Flowableがバックプレッシャーの機能があり、Observableにはない
Flowable/Observableは基本的にReactive Streamsのルールおよびそのルールに影響を与えたObservable契約に従わないと正しくデータが通知されることが保証されない。
通知する際のルールは以下のものがある。
※nullを通知してはならないというルールはRxJava 2.xからのルールでRxJava 1.xではnullを通知することは可能なので注意する。
※データの生成を複数スレッドから行う場合はそもそもの設計を見直すか、1つのスレッド上で処理を行うFlowable/Observableを複数用意し、それらを1つに結合するメソッドを使うなどして処理を行う。
SubscriberおよびObserverは通知されたデータを受け取りそのデータを使った処理を行うインターフェース
Subscriberはバックプレッシャーの機能があり通知するデータ数をリクエストしないといけないのに対し、Observerはバックプレッシャーの機能がないため、データ数の制限なしにデータが通知される
Subscriber/Observerのメソッドが呼ばれる順は以下の通り。
Subscriber/Observerが購読しFlowable/Observableの通知の準備ができたら、onSubscribeメソッドが呼ばれる。このonSubscribeメソッドは1つの購読で1度しか呼ばれない。
データが通知されるたびにonNextメソッドが呼ばれる。複数のデータが通知される場合はその分だけonNextメソッドが呼ばれ、1件もデータが通知されない場合は1度もonNextメソッドが呼ばれない。
onNextメソッドは安全な通知を行う。Flowable/Observableからデータを受け取っている限り、onNextメソッドが同時に実行されることはない。
全てのデータを通知し終えたら、これ以上データを通知することがないことを知らせるためにonCompleteメソッドが呼ばれ、完了時の処理を行う。
Flowable/Observableの処理中にエラーが発生したらonErrorメソッドが呼ばれ、処理を終了する。
各メソッドは1つずつ順番に実行されるが、SubscriberのonSubscribeメソッドだけは例外的に処理の途中でonNextメソッドやonCompleteメソッドが実行される。これはonSubscribeメソッドでSubscriptionのrequestメソッドを呼ぶとFlowableがデータの通知を始めてしまうから。
SubscriberのonSubscribeメソッド内でSubscriptionのrequestメソッドを呼び出すと通知処理が始まってしまうため、もしonSubscribeメソッド内で初期化処理などがある場合は、Subscriptionのrequestメソッドを呼ぶ前に行う必要がある。
public interface Subscription {
public void request(long n);
public void cancel();
}
public interface Disposable {
void dispose();
boolean isDisposed();
}
| 種類 | 説明 |
|---|---|
| PublishProcessor/PublishSubject | データを受け取ったタイミングでしか消費者(Subscriber/Observer)にデータを通知しないProcessor/Subject |
| BehaviorProcessor/BehaviorSubject | 消費者を購読した直前のデータをバッファし、そのデータから通知するProcessor/Subject |
| ReplayProcessor/ReplaySubject | 受け取った全てのデータを途中から登録した消費者にも通知するProcessor/Subject |
| AsyncProcessor/AsyncSubject | データの生成が完了した際に最後に受け取ったデータしか消費者に通知しないProcessor/Subject |
| UnicastProcessor/UnicastSubject | 1つの消費者からしか購読されないProcessor/Subject |
DisposableSubscriber/DisposableObserverはDisposableを実装したSubscriber/Observerの実装クラスで、外部から非同期に購読解除のメソッドを呼ばれても安全に購読解除を実行してくれるクラス
これらのクラスでは、onSubscribeメソッドがfinalメソッドとして実装されており、onSubscribeメソッドで渡されるSubscription/Disposableは隠蔽され直接アクセスできないため、次のメソッドからSubscription/Disposableのメソッドを呼び出す。
DisposableSubscriber のSubscriptionのメソッドを呼び出すメソッド
DisposableObserver のDispose のメソッドを呼び出すメソッド
購読開始時の処理をオーバライドして独自の処理を実装したい場合は、onSubscribeメソッド内で呼ばれているonStartメソッドをオーバライドする。
DisposableSubscriberで初期化処理を行う場合、先に初期化処理を実行してから親のonStartメソッドを呼ぶこと。onStartメソッドを呼び出し後に、初期化処理を実行すると、初期化処理を呼ぶ前に通知処理が始ってしまうので注意が必要。
次回は「【Programming】RxJava リアクティブプログラミング vol.3 / RxJavaの構成~後編~」についてまとめてみます。
written by tamito0201
プログラミングとのご縁結びならプロマリへ。
オンラインプログラミング学習スクールのプロマリは、プログラミングの初学者の皆様を応援しています。プログラミング講師と一緒に面白いアプリを作りませんか。
The programming school "Promari" will help you learn programming. "Promari" is supporting the first scholars of programming. Let's develop an application with our programming instructor.