我是java rx的新手,我想知道这是否可行。
我有一个可观察到的数据不断来自控制器。
它确实是这样的:
observable.asObservable().debounce(10, SECONDS).subscribe(mySubscriber);
final Subscriber<Long> mySubscriber = new Subscriber<Long>() {
@Override
public void onCompleted() {
System.out.println("killing the subscriber");
}
@Override
public void onError(final Throwable throwable) {
}
@Override
public void onNext(final Long number) {
//some stuff
}
};
效果很好,去抖动和onNext,但是当我停止发送事件时我正在等待最后一次去抖(没有信息)会调用onCompleted()但它没有
我需要在触发最后一次去抖后设置超时,同时考虑到N次后可以发布事件。
例如。
如果我有10秒的去抖动和20的超时。
我在第二场比赛后获得第一场比赛。
触发反弹并等待10秒钟。
我在第二节14获得第二项赛事。
触发反弹,我会等到第24天。
超时是在第二个20时触发并杀死用户。
在第二天24,我应该在订阅者处获得该活动,但已被杀死。
我想在考虑到去抖动的最后一次发射后设置超时。
答案 0 :(得分:0)
不确定我建议的是最优雅的方式,但你可以记录最后收到的对象,然后在超时时重新发出它
AtomicReference<Long> lastObject = new AtomicReference<>(null);
Observable
.interval(100, TimeUnit.MILLISECONDS)
.doOnNext(i -> lastObject.set(i))
.debounce(150, TimeUnit.MILLISECONDS)
.timeout(1000, TimeUnit.MILLISECONDS, Observable.create(emitter -> {
if (lastObject.get() != null) emitter.onNext(lastObject.get());
emitter.onComplete();
}))
.subscribe(...);
在这个例子中,我们每100毫秒发射一次,因为去抖动更高,所以不会发射任何物品。因此,当timeout
发生时,我们会在doOnNext
之前重新发出我们在debounce
中记住的最后一项。