RxJava使用autoConnect处理ConnectableObservable

时间:2017-05-24 12:50:00

标签: rx-java rx-java2

我有一个上游以块的形式发送数据。应使用throttleFirst限制此流。此外,在完成所有油门定时器后,应发出最后一个值。不幸的是,RxJava 2中没有throttleFierstBuffered运算符,因此我实现了一个ObservableTransformer:

upstream -> {
      Observable<T> autoConnectingUpstream =
          upstream //
              .publish()
              .autoConnect(2);

      return Observable.merge(
              autoConnectingUpstream.throttleFirst(message.updatelimit().get(), TimeUnit.MILLISECONDS, scheduler),
              autoConnectingUpstream.debounce(message.updatelimit().get(), TimeUnit.MILLISECONDS, scheduler))
          //if debounce and throttle emit the same item
          .distinctUntilChanged();
    }

除处理外,它运作良好。在生成Observable后,我也想处理上游。我怎么能这样做?

我曾尝试使用autoConnect(2,一次性 - &gt; {})访问一次性用品,但必须有更好的方法。到目前为止,我得到了这个,我不喜欢它:

Observable.<T>create(
            emitter -> {
              Observable<T> autoConnectingUpstream =
                  upstream //
                      .publish()
                      .autoConnect(2, emitter::setDisposable);

              Observable.merge(
                      autoConnectingUpstream.throttleFirst(message.updatelimit().get(), TimeUnit.MILLISECONDS, scheduler),
                      autoConnectingUpstream.debounce(message.updatelimit().get(), TimeUnit.MILLISECONDS, scheduler))
                  //if debounce and throttle emit the same item
                  .distinctUntilChanged()
                  .subscribe(emitter::onNext, emitter::onError, emitter::onComplete);
            });

1 个答案:

答案 0 :(得分:2)

我在这里回答我自己的问题,所以如果我错了,请告诉我。

根据akarnokd的评论,解决方案将如下所示:

Observable.<T>create(
        emitter -> {
          Observable<T> autoConnectingUpstream =
              upstream //
                  .publish()
                  .autoConnect(2, emitter::setDisposable);

          Observable.merge(
                  autoConnectingUpstream.throttleFirst(message.updatelimit().get(), TimeUnit.MILLISECONDS, scheduler),
                  autoConnectingUpstream.debounce(message.updatelimit().get(), TimeUnit.MILLISECONDS, scheduler))
              //if debounce and throttle emit the same item
              .distinctUntilChanged()
              .subscribe(emitter::onNext, emitter::onError, emitter::onComplete);
        });

autoConnect的第二个参数是一个Action,它表示已建立的2个连接观察者的连接。

当观察者处理生成的Observable时,这可以与emitter :: setDisposable一起使用来处理autoConnect。