2014-11-03 2 views
0

Допустим, что у меня есть две наблюдаемые A и B. A испускает true, когда служба подключена к моей программе. B испускает true, если служба запущена, иначе false.Заполнитель для наблюдения?

Я хочу комбинировать A и B, используя combLatest, а затем предпринять соответствующие действия.

Проблема в том, что B недоступен, пока я не подключился к службе. Итак, мой вопрос в том, могу ли я иметь заполняющий экземпляр Observable-wraper для B до тех пор, пока не будет доступен B? Затем, когда B имеется, обертка должна испускать эти значения, исходящие от B.

ответ

1

Я придумал простое решение.

Я создал Subject C, как этот

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

Делая это, я был в состоянии что-то вроде этого

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

тогда, когда B становится доступным я

B.subcribe(C); 
0

Возможно, вы можете добиться этого, используя задержку подписки. Вот пример:

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

Спасибо, я придумал более простое решение, увидеть мой собственный ответ. –

0

То, что вы на самом деле говорите, это то, что B зависит от A. В большинстве случаев, когда у вас есть одно наблюдаемое, которое зависит от anoth er вы можете использовать .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. 
     }); 
}