你什么时候关闭一个订购者,谁的emisor是一个具有去抖动的Observable?

时间:2018-05-11 22:47:16

标签: java rx-java

我是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,我应该在订阅者处获得该活动,但已被杀死。

我想在考虑到去抖动的最后一次发射后设置超时。

1 个答案:

答案 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中记住的最后一项。