サーチ…
Observableを作成する
ObservableをRxJavaで作成する方法はいくつかあります。最も強力な方法は、 Observable.createメソッドを使用することです。しかし、それはまた、最も複雑な方法です。だから可能な限り使用しないでください 。
既存の価値を出す
すでに値がある場合は、 Observable.justを使用して値を出力できます。
Observable.just("Hello World").subscribe(System.out::println);
計算すべき値を出力する
まだ計算されていない値、または計算に時間がかかる値を放出する場合は、 Observable.fromCallableを使用して次の値を出力できます。
Observable.fromCallable(() -> longComputation()).subscribe(System.out::println);
longComputation()はObservableを購読するときにのみ呼び出されます。この方法では、計算が怠惰になります。
計算すべき値を放出する別の方法
Observable.deferビルドをObservableだけのようObservable.fromCallableいますが、返却する必要がある場合には使用されているObservable値の代わりに。通話のエラーを管理する場合に便利です。
Observable.defer(() -> {
try {
return Observable.just(longComputation());
} catch(SpecificException e) {
return Observable.error(e);
}).subscribe(System.out::println);
ホット&コールドオブザーバブル
観測対象は、その排出行動に応じて、 HotかColdかに大別して分類される。
Cold Observableは、リクエスト(サブスクリプション)に応じて発光するのに対し、 Hot Observableはサブスクリプションに関係なく発光します。
冷たい観察可能な
/* Demonstration of a Cold Observable */
Observable<Long> cold = Observable.interval(500, TimeUnit.MILLISECONDS); // emits a long every 500 milli seconds
cold.subscribe(l -> System.out.println("sub1, " + l)); // subscriber1
Thread.sleep(1000); // interval between the two subscribes
cold.subscribe(l -> System.out.println("sub2, " + l)); // subscriber2
上記のコードの出力は以下のようになります(変化する可能性があります)。
sub1, 0 -> subscriber1 starts
sub1, 1
sub1, 2
sub2, 0 -> subscriber2 starts
sub1, 3
sub2, 1
sub1, 4
sub2, 2
sub2が遅く始まっても、開始から値を受け取ることに注意してください。結論として、 Cold Observableは、要求されたときにのみ項目を出す。複数の要求が複数のパイプラインを開始します。
ホット観測可能
注意:ホット観測可能オブジェクトは、個々のサブスクリプションとは独立した値を出力します。彼らは独自のタイムラインを持ち、誰かが聞いているかどうかにかかわらずイベントが発生します。 Cold Observaleは簡単なpublish Hot Observable変換できます。
Observable.interval(500, TimeUnit.MILLISECONDS)
.publish(); // publish converts cold to hot
publishは、Observableへの接続と切断の ための機能を追加するConnectableObservableを返します。
ConnectableObservable<Long> hot = Observable
.interval(500, TimeUnit.MILLISECONDS)
.publish(); // returns ConnectableObservable
hot.connect(); // connect to subscribe
hot.subscribe(l -> System.out.println("sub1, " + l));
Thread.sleep(1000);
hot.subscribe(l -> System.out.println("sub2, " + l));
上記の結果は次のとおりです。
sub1, 0 -> subscriber1 starts
sub1, 1
sub1, 2
sub2, 2 -> subscriber2 starts
sub1, 3
sub2, 3
にもかかわらずことに注意してくださいsub2遅く観測を開始し、それはと同期しているsub1 。
切断はもう少し複雑です! DisconnectはObservableではなくSubscriptionで行われます。
ConnectableObservable<Long> hot = Observable
.interval(500, TimeUnit.MILLISECONDS)
.publish(); // same as above
Subscription subscription = hot.connect(); // connect returns a subscription object, which we store for further use
hot.subscribe(l -> System.out.println("sub1, " + l));
Thread.sleep(1000);
hot.subscribe(l -> System.out.println("sub2, " + l));
Thread.sleep(1000);
subscription.unsubscribe(); // disconnect, or unsubscribe from subscription
System.out.println("reconnecting");
/* reconnect and redo */
subscription = hot.connect();
hot.subscribe(l -> System.out.println("sub1, " + l));
Thread.sleep(1000);
hot.subscribe(l -> System.out.println("sub2, " + l));
Thread.sleep(1000);
subscription.unsubscribe();
上記は次を生成する:
sub1, 0 -> subscriber1 starts
sub1, 1
sub1, 2
sub2, 2 -> subscriber2 starts
sub1, 3
sub2, 3
reconnecting -> reconnect after unsubscribe
sub1, 0
...
切断されるとObservable基本的に「終了」し、新しいサブスクリプションが追加されると再開します。
Hot ObservableはEventBus作成に使用できます。このようなEventBusは一般的に軽くて高速です。 RxBusの唯一の欠点は、すべてのイベントを手動で実装してバスに渡す必要があることです。