Rx Java Observable执行直到某些条件

时间:2017-01-25 16:11:20

标签: java android promise rx-java future

我试图找到一种方法来执行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,...);

    }

因此,我们的想法是使用myDelayedObservable运行多个请求(例如下载请求)和zip,因此longRunningTask仅在所有请求加上侦听器时完成(在我的案例视图中)完成布局)完成。

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

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

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

2 个答案:

答案 0 :(得分:1)

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仅在所有可观察项目发出相同数量的项目时才有效,否则它将在第一项完成时立即完成,而不会等待其余时间。

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 ... });

答案 1 :(得分:0)

尝试:

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

或RxJava2

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

准备就绪时,请致电

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