我试图找到一种在满足某些条件之前就可以执行可观察的方法。
考虑以下示例:
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
,但这似乎并不是我的最佳解决方案。 最佳答案
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 ... });