如何在反应式编程中抑制onComplete? (RxJava)

时间:2016-04-20 12:05:06

标签: rx-java reactive-programming

我的控制产生了 Observable。订阅时,它总是产生(如果没有错误):

  

onNext()

     

onCompleted()

我是这样的帮手类:

public class Helper {

    private Subscription subscription;
    private ReplaySubject<MyData> subject;
    private Observable<MyData> coldObservable;

    public HelperClass(Observable<MyData> aColdObservable) {
        coldObservable = aColdObservable;
        subject = ReplaySubject.create(1);
        triggerRefresh();
    }

    public Observable<MyData> getObservable() {
        return subject.asObservable();
    }

    public void triggerRefresh() {
        if (subscription != null) {
            subscription.unsubscribe();
            subscription = null;
        }
        subscription = coldObservable
                              .subscribeOn(Schedulers.io())
                              .observeOn(Schedulers.computation())
                              .subscribe(subject);
    }
}

我已经对该主题进行了多次订阅,请将此伪代码用于客户端:

public class Client {

    private final Helper helper;
    private Observable<MyData> proxiedObservable;

    public Client(Observable<MyData> coldObservable) {
        helper = new Helper(coldObservable);
    }

    public void init() {
        proxiedObservable = helper.getObservable()
                                                        .subscribeOn(Schedulers.io)
                                                        .observeOn(Schedulers.computation());

        Subscription a = newSubscription("A");
        Subscription b = newSubscription("B");
        Subscription c = newSubscription("C");
    }

    public Subscription newSubscription(String name) {
        return proxiedObservable.subscribe(data -> log("next " + name),
                                          throwable -> log("error " + name),
                                          () -> log("complete " + name));
    }

    public void refresh() {
        helper.triggerRefresh();
    }
}

初始化时会打印在日志中:

next A
complete A
next B
complete B
next C
complete C

在调用refresh()之后的某个时刻,我希望重复这个完全相同的日志,而不是打印任何内容。

显然,当冷观察者触发完整事件时,它会自动取消订阅我proxiedObservable的所有订阅。

我不需要完整的活动,但我需要新的MyData来覆盖所有订阅。

有没有办法来抑制onComplete事件?或者还有另一种方法来实现我的需求吗?

2 个答案:

答案 0 :(得分:4)

此问题是RxRelay要解决的问题 - Subject可以接收onComplete,导致其关闭。

如果您不习惯添加此依赖项,那么您也可以使用materialize() + filter()从序列中删除onComplete

答案 1 :(得分:0)

抑制-g(同时仍允许错误传播)的一种简单方法是:

onComplete