2017-10-28 118 views
0

我有兩個觀測量定義,我如下美其名曰:多個可觀測的執行與RxJava

Observable<Boolean> statusObser1 = reactiveApiConsumer.syncGradesSet1(subListDtos.get(0)); 
Observable<Boolean> statusObser2 = reactiveApiConsumer.syncGradesSet2(subListDtos.get(1)); 
statusObser1.toBlocking().first(); 
statusObser2.toBlocking().first(); 

但問題是statusObser1完成後statusObser2只執行。相反,我希望兩位觀察員並行執行,即statusObser2不應等待statusObser1完成。

回答

2

它們會在你阻止(toBlocking())並等待他們的迴應後順序執行。

取而代之的是訂閱它們。單獨:

Observable<Boolean> statusObser1 = ... 
Observable<Boolean> statusObser2 = ... 
statusObser1.subscribe(System.out::println); //Example 
statusObser2.subscribe(System.out::println); //Example 

或者使用zip操作:

public static int doSomethingWithBothValues(Boolean a, Boolean b) { 
    ... 
} 

... 

Observable<Boolean> statusObser1 = ... 
Observable<Boolean> statusObser2 = ... 
Observable.zip(statusObser1,statusObser2, this::doSomethingWithBothValues); 

看到有關郵編操作here更多細節。

在這兩種情況下,如果observables是異步的,它們將並行執行。

還有其他的操作符可以用來組合你的兩個操作符的結果而不會阻止它們中的任何一個。

0

嘗試多線程。

Observable<Boolean> statusObser1 = reactiveApiConsumer.syncGradesSet1(subListDtos.get(0)); 
Observable<Boolean> statusObser2 = reactiveApiConsumer.syncGradesSet2(subListDtos.get(1)); 
startThread(statusObser1); 
startThread(statusObser2); 

public void startThread(Observable<Boolean> statusObser) { 
    new Thread() { 
     @Override 
     public void run() { 
      statusObser.toBlocking().first(); 
     } 
    }.start(); 
} 

startThread方法將在一個新的線程中執行的執行,並且兩個處決WIL在單獨的線程中執行。

+0

這是一個非常糟糕的解決方案。它完全忽略了使用* Reacive *編程技術的重點。 – Malt