基本的な概念を確認
RxJava
は、非同期でイベントベースのプログラムを書くためのライブラリであり、データストリームやシーケンスに対して操作を行うことができます。
このときのデータストリームやシーケンスを表すのが Observable
です。
-
Observable
-
Observable
は、0個以上のデータを発行することができる。 - エラーが発生した場合、それを通知することができる。
- データの発行が完了したら、その旨を通知することができる。
- 例えば、ユーザーのキー入力やネットワークリクエストの結果といった、複数のデータを期待する場面で使います。
-
-
Single
-
Single
は、Observable
の特定のケースとして考えることができます。 -
Single
は、1つのデータもしくは1つのエラーを発行することのみが許されています。 - データが1つしかない、またはエラーが1つだけ起こる可能性がある場面で使用します。例として、ネットワークリクエストで1つのレスポンスを待つシチュエーションが考えられます。
-
ObservableとSingleの関係
-
Single
は、Observable
の特化されたバージョンと考えることができます。Single
は、データが1つしか発行されない特定のシチュエーションに適しています。 -
Observable
にはonNext()
,onError()
,onComplete()
といったメソッドがありますが、Single
にはonSuccess()
とonError()
のみが存在します。
簡単に言えば、複数のデータが発行される可能性がある場合やデータの発行の完了を知りたい場合は Observable
を使用し、1つのデータまたは1つのエラーを期待する場面では Single
を使用します。
具体的なシチュエーションとそれに対応するコードで理解
1. Observable の例
シチュエーション:
- とあるサービスから、ユーザーの一覧を取得します。
- このユーザーの一覧は複数のデータとして取得されます。
Observable<String> userObservable = Observable.create(emitter -> {
emitter.onNext("太郎");
emitter.onNext("花子");
emitter.onNext("テスト子");
emitter.onComplete();
});
userObservable.subscribe(
user -> System.out.println("User: " + user),
throwable -> System.err.println("Error occurred: " + throwable.getMessage()),
() -> System.out.println("完了!")
);
出力:
User: 太郎
User: 花子
User: テスト子
完了!
2. Single の例
シチュエーション:
- 同じウェブサービスから、特定のユーザーの詳細情報を取得します。
- このユーザーの詳細は1つのデータとして取得されます。
コード:
Single<String> userDetailSingle = Single.create(emitter -> {
emitter.onSuccess("太郎, Age: 25, City: Sapporo");
});
userDetailSingle.subscribe(
userDetail -> System.out.println("User Detail: " + userDetail),
throwable -> System.err.println("Error occurred: " + throwable.getMessage())
);
出力:
User Detail: 太郎, Age: 25, City: Sapporo
説明:
-
Observable
は複数のデータを発行することができ、onNext()
で各データを発行し、最後にonComplete()
でデータの発行が完了したことを通知します。 - 一方、
Single
は1つのデータまたは1つのエラーのみを発行します。成功時はonSuccess()
でデータを発行し、エラー時はonError()
でエラーを通知します。
このように、取得するデータの量や種類によって、Observable
や Single
を適切に選択して使用します。