2017-01-25 4 views
2

いくつかの条件が満たされるまで、observableを実行する方法を見つけようとしています。Rx Java 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,...); 

    } 

だからアイデアはとてもlongRunningTaskは、私の場合は場合にのみ、すべての要求に加えて、リスナーを(完了、zipを使用して一緒にmyDelayedObservableで、例えば、ダウンロード要求を複数の要求を実行することです完成したレイアウトを表示する)が完了する。

しかし問題は、リスナー用にObservableを作成する正しい方法を見つけることができないことです。これは、擬似コードので

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

は、これを達成するための正しい方法を提案してください、私は約FutureCallable考えているが、これは私にとって最善の解決策ではないようだ、バリアのようなものです。

+1

' myDelayedObservable'それは任意の値、または単に完全に放出する必要がありますか? 'longRunningTask'についても同じ質問です。実際には 'oneRequest'、' anotherRequest'の結果を使用しますか? –

+0

返信いただきありがとうございます。実際には値を返す必要はありません。私は 'longRunnningTask'が完了したときにすべてが完了したことを確認するために、障壁にする必要があります。 – brqgddez

+1

実際に 'oneRequest'、' anotherRequest'の結果を使用していますか? –

答えて

1

で試してみてください:

PublishSubject<Boolean> myDelayedObservable = PublishSubject.create<>(); 

またはRxJava2

PublishProcessor<Boolean> myDelayedObservable = PublishProcessor.create<>(); 

そして準備のためだけ

myDelayedObservable.onNext(true) 
//not this, myDelayedObservable.onComplete(); 
+1

答えをありがとう、これは私が探しているものに似ていますが、私は完了を呼び出すと、完了するために別のzipの観測を待つことはありません。 – brqgddez

+0

代わりにonNextを呼び出そうとしましたか? onCompleteは排出を行わず、ジップは仕事を集める前に排出が必要であるため、onNext。 – MatBos

2

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を使用してください:あなたのリスナーの準備ができたら、myDelayedObservable.onComplete()を呼び出す

Subject<Boolean> myDelayedObservable = PublishSubject.create(); 

4)。

5)はallInOneを購読し、完了時に反応する:任意 `onNext`なし

allInOne.subscribe(b -> { ... }, e -> { ... }, 
    () -> { ... go ahead with your next task ... }); 
+0

あなたの偉大な答えをありがとうので、基本的にzipはobservablesのいずれかが完了したら、常に完了しますか? – brqgddez

+0

ダウンロードオブザーバブルがこのリスナをトリガしているため、ネットからdatをダウンロードしているタスクを追加するには、リスナタスクに関連しています。 – brqgddez

+0

'zip'に関する@brqgddez:正確ではありません。あなたから次の価値が期待されても*値なしで*完了すると、すぐに完了します(値なしでも)。それ以外の場合は、他の入力から対応する値を取得し、圧縮された値を出力して完了します。ドキュメントを読む:http://reactivex.io/RxJava/javadoc/rx/Observable.html#zip(rx.Observable,%20rx.Observable,%20rx.functions.Func2) –

関連する問題