rxJava debounce() 运算符不适用于 Observable.range()
rxJava debounce() operator not working with Observable.range()
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 emissions/s)并且持续不断地达到 onNext()
。
我期待的是:当我使用debounce()
时,延迟1000毫秒后只会发出1个数字(延迟时可以跳过数字2 次排放之间)。意味着发射将像上面的搜索框示例一样一个接一个地向下游。
我是 rx 的新手,请帮我实现这个并解释为什么?我真的不知道为什么我必须使用另一个运算符但是 debounce()
因为想法是一样的!
debounce
通过定义一个宽限期来防止下游不堪重负,该宽限期必须在事件之间经过才能获得最后一个事件,换句话说,它会在一段安静的时间后发出最新的元素。 Range 将尽可能快地遍历它的项目,因此项目之间不会有足够的时间,只有最后一个才会被发射。
debounce
根本不是您的用例所需的运算符。 2.x 的扩展项目具有适用于您的用例的 spanout 运算符。
您需要的是 每项 '.delay()' 运算符。请参阅此处的说明 -
http://reactivex.io/RxJava/javadoc/rx/Observable.html#delay-rx.functions.Func1-
Observable
.range(1, 10000)
.delay(new Func1<Integer, Observable<Long>>() {
@Override
public Observable<Long> call(Integer integer) {
return Observable.timer(1, TimeUnit.SECONDS );
}
});
对于良好的顺序,'.debounce()'对于这个用例来说绝对是不可能的。
使用延迟而不是去抖动
Observable.range(1, 10000)
.delay(1000, TimeUnit.MILLISECONDS)
.subscribe(...);
Observable.range(1, 10000)
.debounce(500, TimeUnit.MILLISECONDS)
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(....);
试试这个方法。
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 emissions/s)并且持续不断地达到 onNext()
。
我期待的是:当我使用debounce()
时,延迟1000毫秒后只会发出1个数字(延迟时可以跳过数字2 次排放之间)。意味着发射将像上面的搜索框示例一样一个接一个地向下游。
我是 rx 的新手,请帮我实现这个并解释为什么?我真的不知道为什么我必须使用另一个运算符但是 debounce()
因为想法是一样的!
debounce
通过定义一个宽限期来防止下游不堪重负,该宽限期必须在事件之间经过才能获得最后一个事件,换句话说,它会在一段安静的时间后发出最新的元素。 Range 将尽可能快地遍历它的项目,因此项目之间不会有足够的时间,只有最后一个才会被发射。
debounce
根本不是您的用例所需的运算符。 2.x 的扩展项目具有适用于您的用例的 spanout 运算符。
您需要的是 每项 '.delay()' 运算符。请参阅此处的说明 - http://reactivex.io/RxJava/javadoc/rx/Observable.html#delay-rx.functions.Func1-
Observable
.range(1, 10000)
.delay(new Func1<Integer, Observable<Long>>() {
@Override
public Observable<Long> call(Integer integer) {
return Observable.timer(1, TimeUnit.SECONDS );
}
});
对于良好的顺序,'.debounce()'对于这个用例来说绝对是不可能的。
使用延迟而不是去抖动
Observable.range(1, 10000)
.delay(1000, TimeUnit.MILLISECONDS)
.subscribe(...);
Observable.range(1, 10000)
.debounce(500, TimeUnit.MILLISECONDS)
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(....);
试试这个方法。