Observable とは
ObservableはRxJavaの中心的なクラスで、ある一連のデータまたはイベントを非同期で発行するオブジェクトです。このObservableが発行するデータを受け取る側のことをObserverといいます。
イメージ的には、Observableは放送局のようなもので、Observerはテレビの受信機のようなものです。
Observable の基本的な動作
-
onNext:
Observableは0回以上onNextを呼び出してデータをObserverに送信します。 -
onError: エラーが発生した場合、
Observableはこのメソッドを呼び出してエラーを通知します。このメソッドが呼び出されたあと、他のメソッドは呼び出されません。 -
onComplete:
Observableがもうこれ以上データを発行しないことをObserverに通知するためにこのメソッドを呼び出します。このメソッドが呼び出されたあと、他のメソッドは呼び出されません。
Observable の簡単な例
Observable<String> observable = Observable.create(emitter -> {
emitter.onNext("Item 1");
emitter.onNext("Item 2");
emitter.onComplete();
});
Observer<String> observer = new Observer<String>() {
@Override
public void onNext(String item) {
System.out.println(item);
}
@Override
public void onError(Throwable e) {
System.err.println("Error occurred!");
}
@Override
public void onComplete() {
System.out.println("Done!");
}
};
observable.subscribe(observer);
実行結果
Item 1
Item 2
Done!
この例では、ObservableはItem 1とItem 2という二つのデータを発行しており、それをObserverが受け取っています。最後にObservableは完了を通知しています。
補足
なぜ各メソッドをオーバーライドしているのか?
Observerはインターフェースです。そして、そのインターフェースにはonNext, onError, onCompleteという3つの抽象メソッドが定義されています。これらのメソッドはObservableがデータやイベントを発行するときに呼び出されます。
具体的な動作を知りたいので、このインターフェースを実装する際にこれらのメソッドをオーバーライドします。つまり、具体的にonNextが呼び出されたときに何をするか、onErrorが呼び出されたときにどのようなエラーハンドリングをするかなどを定義します。
observable.subscribe(observer);はなんのための処理なのか?
observable.subscribe(observer);は、Observer(データの受信側)をObservable(データの送信側)に登録するイメージです。これにより、Observableがデータやイベントを発行するたびに、Observerの対応するメソッド(onNext, onError, onComplete)が呼び出されるようになります。
簡単に言うと、subscribeメソッドはObserverをテレビ放送の受信機に「登録」するようなものです。この「登録」をすることで、放送局が放送を開始したら、登録された受信機でその放送内容を受け取ることができるようになります。
まとめると、Observerのインスタンスを作成してそのメソッドをオーバーライドすることで、データ受信時の具体的な動作を定義します。そして、subscribeメソッドを使用して、そのObserverをObservableに「登録」することで、データの受信が開始されます。
まとめ
-
Observableはデータのソース。データを非同期に発行する。 -
Observerはデータの消費者。Observableからデータを受け取る。 -
ObservableとObserverはRxJavaの非同期データフローを形成します。
難しい〜