可以說我有兩個Observable A和B. 當服務連接到我的程序時,A發出true。如果服務啓動,則B發出true,否則爲false。Observable的佔位符?
我想使用combineLatest結合A和B,然後採取適當的行動。
問題是B在我連接到服務之前不可用。所以我的問題是,如果我可以有B的Observable-wrapper和佔位符,直到B可用?然後,當B可用時,包裝應該發出來自B的值。
可以說我有兩個Observable A和B. 當服務連接到我的程序時,A發出true。如果服務啓動,則B發出true,否則爲false。Observable的佔位符?
我想使用combineLatest結合A和B,然後採取適當的行動。
問題是B在我連接到服務之前不可用。所以我的問題是,如果我可以有B的Observable-wrapper和佔位符,直到B可用?然後,當B可用時,包裝應該發出來自B的值。
我想出了一個簡單的解決方案。
我創建了一個主題C,這樣
BehaviorSubject<Boolean> C = BehaviorSubject.create(false);
通過這樣做,我能夠像這樣
Observable.combineLatest(A, C, bla bla....
然後當B變得可用我做
B.subcribe(C);
也許你可以使用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();
你真正說的是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.
});
}
謝謝你,我想出了一個簡單的解決方案,看到了自己的答案。 – 2014-11-03 18:33:57