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