簡體   English   中英

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

[英]rxJava debounce() operator not working with Observable.range()

AFAIK是rxJava的debounce 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)運算符debounce(1000, TimeUnit.MILISECONDS)但排放仍然非常快(大約1000個排放/秒)並且不斷地onNext()

我想要的是 :當我使用debounce() ,在延遲1000毫秒之后只會發出1個數字(它可以在延遲2個發射之間跳過數字)。 意味着排放將像上面的搜索框示例一樣逐個下游。

我是rx的新手請幫助我實現這個並解釋原因? 我真的不知道為什么我必須使用另一個運算符但debounce()因為這個想法是一樣的!

debounce通過定義事件之間必須經過的寬限期來防止下游被淹沒,以便獲得最后一個事件,換句話說,它會在一些安靜時間之后發出最新元素。 范圍將以盡可能快的速度通過其項目,因此項目之間沒有足夠的時間,只會發出最后一個項目。

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

試試這種方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM