LoginSignup
0
0

RxJavaのObservable と Single について理解していく

Posted at

基本的な概念を確認

RxJava は、非同期でイベントベースのプログラムを書くためのライブラリであり、データストリームやシーケンスに対して操作を行うことができます。
このときのデータストリームやシーケンスを表すのが Observable です。

  1. Observable

    • Observable は、0個以上のデータを発行することができる。
    • エラーが発生した場合、それを通知することができる。
    • データの発行が完了したら、その旨を通知することができる。
    • 例えば、ユーザーのキー入力やネットワークリクエストの結果といった、複数のデータを期待する場面で使います。
  2. 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() でエラーを通知します。

このように、取得するデータの量や種類によって、ObservableSingle を適切に選択して使用します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0