Rx java RxJava使用自动连接处理可连接的可观察对象

Rx java RxJava使用自动连接处理可连接的可观察对象,rx-java,rx-java2,Rx Java,Rx Java2,我有一个上游,它以块的形式发送数据。应使用throttleFirst对该流进行节流。此外,在所有油门定时器完成后,应发出最后一个值。不幸的是,RxJava 2中没有throttleFierstBuffered运算符,因此我实现了一个ObservateTransformer: upstream -> { Observable<T> autoConnectingUpstream = upstream // .publish

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

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();
    }
上游->{
可观测自连接气流=
上游//
.publish()
.自动连接(2);
返回可观察。合并(
autoConnectingUpstream.throttleFirst(message.updatelimit().get(),TimeUnit.millides,调度器),
autoConnectingUpstream.debounce(message.updatelimit().get(),TimeUnit.millides,调度器))
//如果去盎司和节流阀发出相同的项目
.distinctUntilChanged();
}
除了处理外,它工作得很好。在处理了生成的可观察对象之后,我还要处理上游。我该怎么做

我曾尝试使用自动连接(2,一次性->{})访问一次性文件,但肯定有更好的方法。到目前为止,我得到了这个,但我不喜欢它:

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);
            });
Observable.create(
发射器->{
可观测自连接气流=
上游//
.publish()
.自动连接(2,发射器::一次性);
可观察的合并(
autoConnectingUpstream.throttleFirst(message.updatelimit().get(),TimeUnit.millides,调度器),
autoConnectingUpstream.debounce(message.updatelimit().get(),TimeUnit.millides,调度器))
//如果去盎司和节流阀发出相同的项目
.distinctUntilChanged()
.subscribe(发射器::onNext,发射器::onError,发射器::onComplete);
});

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

根据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);
        });
Observable.create(
发射器->{
可观测自连接气流=
上游//
.publish()
.自动连接(2,发射器::一次性);
可观察的合并(
autoConnectingUpstream.throttleFirst(message.updatelimit().get(),TimeUnit.millides,调度器),
autoConnectingUpstream.debounce(message.updatelimit().get(),TimeUnit.millides,调度器))
//如果去盎司和节流阀发出相同的项目
.distinctUntilChanged()
.subscribe(发射器::onNext,发射器::onError,发射器::onComplete);
});
自动连接的第二个参数是一个动作,它表示由两个连接的观察者建立的连接


这可与emitter::setDisposable一起使用,以在观察者处理生成的可观察对象时处理自动连接。

autoConnect()
不提供
自动断开连接。如果您想在没有订户的情况下从上游断开连接。使用
refcount()
。相反,嗨!我不能在没有重播的情况下使用refcount,因为在第一个订阅者订阅之后,上游可以发出一个事件,并且它不会被转发到第二个“分支”,而第二个“分支”尚未订阅。我可能不得不使用subscribeOn,但它似乎有点太多了。它是
自动连接(2,一次性->{})