RxJava仅在发射器停止时发射

时间:2017-01-27 13:11:12

标签: android rx-java2

在Android应用中,我只想在用户停止选择列表中的项目列表后刷新列表。所以实际上,我希望只有在制作人停止发射至少500毫秒后才能通知观察者。

现在我有以下内容:

Subject<Object> _bus = PublishSubject.create().toSerialized();

...
_bus.onNext(new Event());
...

_bus.delay(500, TimeUnit.MILLISECONDS)
    .distinctUntilChanged()
    .observeOn(Schedulers.computation())
    .subscribe(event -> {
      // Do something with event
    }));

这很好,除非它以500 ms的间隔发射,即使信号源仍在发光。我想等待500毫秒来查看源是否已停止调用onNext()然后才发出。

这可能吗?

2 个答案:

答案 0 :(得分:2)

所以基本上你需要用缓冲区去抖动。有article应该帮助你。

从该文章中抽取样本:

Observable<Object> tapEventEmitter = _rxBus.toObserverable().share();
    Observable<Object> debouncedEventEmitter = tapEventEmitter.debounce(1, TimeUnit.SECONDS);
    Observable<List<Object>> debouncedBufferEmitter = tapEventEmitter.buffer(debouncedEventEmitter);

    debouncedBufferEmitter.buffer(debouncedEventEmitter)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1<List<Object>>() {
          @Override
          public void call(List<Object> taps) {
            _showTapCount(taps.size());
          }
        });

答案 1 :(得分:0)

我认为你必须使用去抖运算符而不是延迟,例如。

_bus.debounce(500, TimeUnit.MILLISECONDS
.distinctUntilChanged()
.observeOn(Schedulers.computation())
.subscribe(event -> {
  // Do something with event
}));