Rx Java Observable 执行直到某个条件

2024-01-06

我正在尝试找到一种执行可观察的方法,直到满足某些条件。

考虑以下示例:

 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(使用前将#替换为@)

Rx Java Observable 执行直到某个条件 的相关文章

随机推荐