我正在尝试找到一种执行可观察的方法,直到满足某些条件。
考虑以下示例:
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
using zip
, so 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) Use Observable.merge()
将它们全部合并到单个流中。Using 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 ... });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)