我试图找到一种在满足某些条件之前就可以执行可观察的方法。

考虑以下示例:

 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,...);

    }


因此,想法是运行多个请求(例如,下载请求)以及使用myDelayedObservablezip,因此longRunningTask仅在所有请求和侦听器(在我的情况下为完成的布局)完成时才完成。

但是问题是,我找不到为监听器创建Observable的正确方法。就像障碍,所以伪代码

while(!viewIsLaidOut) {
  // just wait
}
observable.complete();
// After that `longRunningTask` should be completed


请提出实现此目标的正确方法,我已经考虑过FutureCallable,但这似乎并不是我的最佳解决方案。

最佳答案

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 ... });

07-25 22:41