【问题标题】:Placeholder for Observable?可观察的占位符?
【发布时间】:2014-12-29 18:03:48
【问题描述】:

假设我有两个 Observable A 和 B。 当服务连接到我的程序时,A 发出真值。如果服务启动,B 发出 true,否则发出 false。

我想使用 combineLatest 合并 A 和 B,然后采取适当的措施。

问题是在我连接到服务之前 B 不可用。所以我的问题是,在 B 可用之前,我是否可以为 B 使用 Observable-wrapper och 占位符?然后当 B 可用时,包装器应该发出来自 B 的值。

【问题讨论】:

    标签: rx-java


    【解决方案1】:

    我想出了一个简单的解决方案。

    我创建了一个主题 C,像这样

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

    通过这样做,我能够做到这样的事情

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

    然后当 B 可用时,我会这样做

    B.subcribe(C);
    

    【讨论】:

      【解决方案2】:

      也许您可以使用 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();
      

      【讨论】:

      • 谢谢,我想出了一个更简单的解决方案,看我自己的答案。
      【解决方案3】:

      您真正的意思是 B 依赖于 A。大多数情况下,当您有一个依赖于另一个的 observable 时,您可以使用 .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.
              });
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-09
        • 2011-06-09
        • 2018-01-27
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        • 2021-01-12
        • 2012-04-20
        相关资源
        最近更新 更多