Rx Java可观察执行,直到出现某种情况

Rx Java可观察执行,直到出现某种情况,java,android,promise,rx-java,future,Java,Android,Promise,Rx Java,Future,我试图找到一种方法来执行observable,直到满足某些条件 考虑以下示例: myDelayedObservable = createListenerObserver(); public Observable<Boolean> createListenerObserver() { // The part I am looking for } ViewTreeObserver.OnGlobalLayoutListener listenerLa

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

    }
请建议实现这一目标的正确方法,我曾考虑过
未来
可调用
,但这似乎不是我的最佳解决方案

试试:

PublishSubject<Boolean> myDelayedObservable = PublishSubject.create<>();
1) 您需要
将所有可观察对象映射到同一类型,例如
可观察对象
,以便合并它们:

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

3)
myDelayedObservable
只是在一些监听器回调之前保持
allInOne
不完整的可观察对象之一。为此,请使用
主题

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

myDelayedObservable
它应该发出任何值,还是只是在没有任何
onNext
的情况下完成?关于
longRunningTask
的相同问题。您是否实际使用了来自
oneRequest
另一个请求的结果
?感谢您的回复,它确实不需要返回任何值,我需要它只是作为一个屏障,以确保在我的
longrunningtask
完成时所有内容都已完成。您实际使用了来自
oneRequest
的结果吗,
另一个请求
?@yaroslavstavnichity不,我其实不在乎结果。只有一件事很重要,那就是多个请求应该被压缩,这样我就可以知道一切都准备好了。谢谢你的回答,这看起来和我要找的类似,但当我调用complete时,它不会等待另一个压缩的可观察对象完成。你试着调用onNext了吗?onComplete不会进行任何发射,而zip需要在收集工作之前进行发射,因此onNext。感谢您的回答,因此基本上zip将在任何可观察对象完成时始终完成?要添加我从网络下载dat的任务,请添加与侦听器任务相关的任务,因为下载观测值正在触发此侦听器。@brqgddez关于
zip
:不完全正确。当它期望您提供下一个值,但您完成时没有值,它会立即完成(也没有值)。否则,它将尝试从其他输入获取相应的值,发出压缩值,然后完成。阅读文档:
 myDelayedObservable.onNext(true)
 //not this, myDelayedObservable.onComplete();
observable1.map(String s -> "...".equals(s))
observable2.map(Integer i -> i > 0 && i < 100)
observable3.map(MyClass m -> true)
...
Observable<Boolean> allInOne = Observable.merge(observable1, observable2, ...);
Subject<Boolean> myDelayedObservable = PublishSubject.create();
allInOne.subscribe(b -> { ... }, e -> { ... },
    () -> { ... go ahead with your next task ... });