Rx Java可观察执行,直到出现某种情况
我试图找到一种方法来执行observable,直到满足某些条件 考虑以下示例: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
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 ... });