RxJava 仅在发射器停止时发射
RxJava emit only when emitter stops
在 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 毫秒的间隔发射,即使源仍在发射。我想等待 500 毫秒以查看源是否已停止调用 onNext()
然后才发出。
这可能吗?
我认为你必须使用去抖运算符而不是延迟,例如
_bus.debounce(500, TimeUnit.MILLISECONDS
.distinctUntilChanged()
.observeOn(Schedulers.computation())
.subscribe(event -> {
// Do something with event
}));
所以基本上你需要用缓冲区去抖动。有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());
}
});
在 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 毫秒的间隔发射,即使源仍在发射。我想等待 500 毫秒以查看源是否已停止调用 onNext()
然后才发出。
这可能吗?
我认为你必须使用去抖运算符而不是延迟,例如
_bus.debounce(500, TimeUnit.MILLISECONDS
.distinctUntilChanged()
.observeOn(Schedulers.computation())
.subscribe(event -> {
// Do something with event
}));
所以基本上你需要用缓冲区去抖动。有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());
}
});