Заполнитель для наблюдаемого?

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

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

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


person Erik Z    schedule 03.11.2014    source источник


Ответы (3)


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

Я создал Тему C, вот так

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

Делая это, я смог что-то вроде этого

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

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

B.subcribe(C);
person Erik Z    schedule 03.11.2014

Возможно, вы можете добиться этого, используя 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();
person Luciano    schedule 03.11.2014
comment
Спасибо, я придумал более простое решение, смотрите мой собственный ответ. - person Erik Z; 03.11.2014

На самом деле вы говорите, что B зависит от A. В большинстве случаев, когда у вас есть одна наблюдаемая, которая зависит от другой, вы можете использовать .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.
        });
}
person kjones    schedule 03.11.2014