[英]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
请提出正确的方法来实现这一点,我已经考虑过Future
, Callable
但这对我来说似乎不是最好的解决方案。
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.