rxJava debounce()运算符不使用Observable.range()

时间:2017-12-09 15:38:33

标签: java android rx-java rx-android rx-java2

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() {

                    }
                });
尽管我已经应用了onNext()运算符,否则排放量会持续debounce(1000, TimeUnit.MILISECONDS)非常快(大约1000个排放/秒)并持续增加。

希望我期待:当我使用debounce()时,在延迟1000毫秒之后只会发出1个数字(在延迟2个排放时可以跳过数字)。意味着排放将像上面的搜索框示例一样逐个下游。

我是rx的新手,请帮助我实现这个并解释原因?我真的不知道为什么我必须使用另一个运算符,但debounce()因为这个想法是一样的!

4 个答案:

答案 0 :(得分:4)

debounce通过定义事件之间必须经过的宽限期以便获取最后一个事件来防止下游被淹没,换句话说,它将在一些安静时间之后发出最新元素。范围将以尽可能快的速度通过其项目,因此在项目之间没有足够的时间,并且只有最后一个将被发出。

debounce根本不是您的用例所需的运算符。 2.x的扩展项目为您的用例提供了spanout运算符。

答案 1 :(得分:2)

您需要的是每个项目'.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()'对于这个用例绝对不可能。

答案 2 :(得分:1)

使用延迟而不是去抖动

Observable.range(1, 10000)
          .delay(1000, TimeUnit.MILLISECONDS)
          .subscribe(...);

答案 3 :(得分:1)

  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(....);

试试这种方式。