RxAndroid:创建简单的Hot Observable

时间:2015-12-02 22:36:52

标签: android rx-java observable rx-android

我正在创建一个Observable,它在订阅时会发出整数。我现在的实现已经建立,所以订阅它的行为从一开始就触发了生成,如下所示:

private Observable createObservable() {
    return Observable.create (
        new Observable.OnSubscribe<Integer>() {

            @Override
            public void call(Subscriber<? super Integer> sub) {

                for (int i = 1; i < MAX_PROGRESS + 1; i++) {
                    sub.onNext(i);
                    SystemClock.sleep(1000);
                }
                sub.onCompleted();
            }
        }
    );
}

我的理解是这是一个冷的Observable。我想要生成序列而不管任何订阅者,并且当订阅者订阅时,希望他们接收在订阅时恰好是当前的值。 IOW,把它变成一个热的Observable。我宁愿不是Observable的子类,因为它将它绑定到一个具体的Integer,而在实践中,实际的类型会有所不同。

2 个答案:

答案 0 :(得分:3)

结帐rx.subjects.BehaviorSubject<T>。如果您不熟悉rx.subjects.Subject,我可以想到的最常见的方式是它们打破了A点和B点之间订阅的连续性。它是如何同时成为{{1} }};可以从多个来源接受Observer<T>警告:需要外部线程安全性)。另一方面,主题也是onNext(),因此多个Observable<T>可以订阅,而Observer<T>将会被多播到每个下游onNext()

如果您的代码看起来像

Observer<T>

使用BehaviorSubject的方法是

Observable<T> src = ...;
Subscriber<T> dst;
src.subscribe(dst);

立即订阅源,主题将采取与抛出的速度一样快。 BehaviorSubject仅保留更新的值并删除defaultValue&amp;之前的所有价值观。

Observable<T> src = ...;
BehaviorSubject<T> subject = BehaviorSubject.create(defaultValue);
src.subscribe(subject);

订阅时// safe to do multiple times. Subscriber<T> dst; subject.subscribe(dst); 会在订阅后立即从dst(或src)收到最新值,然后是defaultValue取消订阅后的所有后续值。

警告:受试者容易被滥用,所以请确保您需要。

答案 1 :(得分:0)

在你的例子中使用&#34; Observable.create&#34;每次调用功能。 &#34;热&#34;订阅从Observable中保存一些实例。你还需要使用一些Rx方法(cache(),retry())在代码中它看起来像:

id

如你所见。我只使用mSubscription.subscribe()和mSubscription.unsubscribe()并仅在saveInstanceState为null时创建Observable。