2014-11-03 92 views
0

可以說我有兩個Observable A和B. 當服務連接到我的程序時,A發出true。如果服務啓動,則B發出true,否則爲false。Observable的佔位符?

我想使用combineLatest結合A和B,然後採取適當的行動。

問題是B在我連接到服務之前不可用。所以我的問題是,如果我可以有B的Observable-wrapper和佔位符,直到B可用?然後,當B可用時,包裝應該發出來自B的值。

回答

1

我想出了一個簡單的解決方案。

我創建了一個主題C,這樣

BehaviorSubject<Boolean> C = BehaviorSubject.create(false); 

通過這樣做,我能夠像這樣

Observable.combineLatest(A, C, bla bla.... 

然後當B變得可用我做

B.subcribe(C); 
0

也許你可以使用delaySubscription來實現。這裏有一個例子:

ExecutorService executorService = Executors.newCachedThreadPool(); 
Future<Void> future = executorService.submit(() -> { 
    Thread.sleep(3000); 
    //service started 
    return null; 
}); 
Observable<Void> oFuture = Observable.from(future, Schedulers.newThread()); 
Observable<Long> oA = Observable.interval(1, TimeUnit.SECONDS); 
Observable<Long> oB = Observable.interval(100, TimeUnit.MILLISECONDS); 
Observable<Long> delayedObservable = oB.delaySubscription(new Func0<Observable<Void>>() { 
    @Override public Observable<Void> call() { 
    return oFuture; 
    } 
}); 
Observable<String> stringObservable = Observable.combineLatest(oA, delayedObservable, (i1, i2) -> i1 + "-" + i2); 
executorService.submit(() -> { 
    stringObservable.forEach(System.out::println); 
}); 
Thread.sleep(10000); 
executorService.shutdownNow(); 
+0

謝謝你,我想出了一個簡單的解決方案,看到了自己的答案。 – 2014-11-03 18:33:57

0

你真正說的是B依賴於A.大多數情況下,當你有一個依賴於anoth的觀察值時呃你可以使用.flatMap()來表達這種關係。

Observable<Boolean> createObservableA() { 
    return ...; // Same as you currently have for creating Observable A. 
} 

Observable<Boolean> createObservableB() { 
    return createObservableA() 
     .flatMap(serviceConnected -> { 
      if (!serviceConnected) { 
       // Don't emit anything to subscribers yet. 
       return Observable.empty(); 
      } 

      return ...; // Service is now connected create Observable B. 
     }); 
}