我试图找到一种方法来执行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
请提出正确的方法来实现这一点,我考虑过Future
,Callable
,但这似乎不是我的最佳解决方案。
答案 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();