相当于RxJava的RxJS.pausable(Observable)

时间:2016-02-16 10:46:42

标签: java rx-java reactive-programming rxjs rx-android

我为RxJava搜索等效的RxJS.pausable(Observable)

目前我有以下内容,但看起来有点奇怪。还有更好的方法吗?

PublishSubject<Boolean> allValidSubject = PublishSubject.create();
PublishSubject<Void> clickSubject = PublishSubject.create();

allValidSubject
      .switchMap(valid -> valid ? clickSubject : Observable.empty())
      .skipUntil(allValidSubject)
// ...

最后我有两个可观察者。一个用于输入验证,一个用于发送按钮单击事件。

1 个答案:

答案 0 :(得分:2)

我认为这样的事情会做到。

Observable<String> event = Observable.just("My Input");
// false - paused by default
final BehaviorSubject<Boolean> pauser = BehaviorSubject.create(false);

event
    .flatMap(new Func1<String, Observable<String>>() {
        @Override
        public Observable<String> call(final String input) {
            return pauser
                    .distinctUntilChanged()
                    .filter(new Func1<Boolean, Boolean>() {
                        @Override
                        public Boolean call(Boolean resumed) {
                            return resumed;
                        }
                    })
                    .map(new Func1<Boolean, String>() {
                        @Override
                        public String call(Boolean resumed) {
                            return input;
                        }
                    });
        }
    })
    .subscribe(new Action1<String>() {
        @Override
        public void call(String input) {
            // handle input
        }
    });

恢复/ pase:

pauser.onNext(true);
pauser.onNext(false);

事件可观察性可以用combineLatest替换,如上所述,但它是每个用例,仍然可以是flatMapped。同样的fasle / true可以被推到暂停上,这是distrinctUntilChanged开始的地方,以避免恢复或暂停,如果已经恢复/暂停。