繁体   English   中英

Rx Java Observable 执行直到某个条件

[英]Rx Java Observable execute until some condition

我试图找到一种方法来执行 observable 直到满足某些条件。

考虑以下示例:

 myDelayedObservable = createListenerObserver();
    public Observable<Boolean> createListenerObserver() {

      // The part I am looking for
    }

    ViewTreeObserver.OnGlobalLayoutListener listenerLayout = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
           myDelayedObservable.onCompleted();
         getTargetView().getViewTreeObserver().removeGlobalOnLayoutListener(this);

        }
    };

    public void performMultipleRequests() {

        Observable<Boolean> longRunningTask = Observable.zip(oneRequest, anotherRequest, myDelayedObservable,...);

    }

所以这个想法是运行多个请求,例如一个下载请求,以及使用zip myDelayedObservable ,所以longRunningTask只有在所有请求和监听器(在我的情况下视图完成布局)完成时才完成。

但问题是,我找不到为听众创建 Observable 的正确方法。 它就像一个屏障,所以伪代码

while(!viewIsLaidOut) {
  // just wait
}
observable.complete();
// After that `longRunningTask` should be completed

请提出正确的方法来实现这一点,我已经考虑过FutureCallable但这对我来说似乎不是最好的解决方案。

1)您需要将所有可观察对象map到同一类型,例如。 Observable<Boolean> ,因此您可以合并它们:

observable1.map(String s -> "...".equals(s))
observable2.map(Integer i -> i > 0 && i < 100)
observable3.map(MyClass m -> true)
...

2) 使用Observable.merge()将它们全部合并为单个流。 为此目的使用zip仅当所有 observables 发出相同数量的 items 时才有效,否则它会在第一个完成后立即完成,而无需等待其余的。

Observable<Boolean> allInOne = Observable.merge(observable1, observable2, ...);

3) myDelayedObservable只是那些应保持allInOne不完整直到某些侦听器回调的可观察对象之一。 为此目的使用Subject

Subject<Boolean> myDelayedObservable = PublishSubject.create();

4) 当你的监听器准备好时,调用myDelayedObservable.onComplete()

5) 订阅allInOne并在完成时做出反应:

allInOne.subscribe(b -> { ... }, e -> { ... },
    () -> { ... go ahead with your next task ... });

尝试:

PublishSubject<Boolean> myDelayedObservable = PublishSubject.create<>();

或 RxJava2

 PublishProcessor<Boolean> myDelayedObservable = PublishProcessor.create<>();

准备好后就打电话

 myDelayedObservable.onNext(true)
 //not this, myDelayedObservable.onComplete();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM