【发布时间】:2017-12-09 15:38:32
【问题描述】:
AFAIK,rxJava 的debounce() 运算符用于延迟事件的发射。当我使用搜索框应用它时,它可以正常工作:
RxTextView.textChangeEvents(editText)
.debounce(1000, TimeUnit.MILLISECONDS) //Only emit after 1 sec
.subscribe(new Observer<TextViewTextChangeEvent>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(TextViewTextChangeEvent event) {
//Get more information about text change event
Log.e(TAG, "Before: " + event.before() + ", start: " + event.start() + ", count: " + event.count());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.e(TAG, "textChangeEvents: onComplete");
}
});
但是当我像这样使用Observable.range() 应用它时:
Observable.range(1, 10000)
.debounce(1000, TimeUnit.MILLISECONDS)
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Long integer) {
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
尽管我已经应用了debounce(1000, TimeUnit.MILISECONDS) 操作符,但排放量会以非常快的速度(大约 1000 个排放量/秒)持续达到onNext()。
我期望的是:当我使用debounce() 时,延迟 1000 毫秒后只会发出 1 个数字(它可以在延迟 2 次发射之间跳过数字)。意味着发射将像上面的搜索框示例一样向下游移动。
我是 rx 新手,请帮助我实现这一目标并解释原因?我真的不知道为什么我必须使用另一个运算符,但 debounce() 因为这个想法是一样的!
【问题讨论】:
-
debounce通过定义一个宽限期来防止下游不堪重负,该宽限期必须在事件之间经过才能获得最后一个事件。 Range 将尽可能快地检查其项目。 2.x 的扩展项目为此使用了spanout运算符。 -
@akarnokd 我没明白,为什么不能以同样的方式应用它们,而是使用 spanout?
-
不同的运算符用于不同的目的、转换和协调模式。
-
@akarnokd,先生,据我了解,只应发出最后一个值(10000),因为这些项目“尽可能快”发出,因此每次重置 1000 毫秒计数器,并且只有当最后一个项目(10000)被发出时,1000ms 才会最终失效。这不是
debounce()应该如何运作吗? -
@azizbekian 当我在Android主线程上观察它时它只会发出最后一个值(10000)(导致应用程序没有响应)
标签: java android rx-java rx-android rx-java2