java - rxJava debounce() 运算符不适用于 Observable.range()

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

据我所知,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 将尽可能快地遍历它的项目,因此项目之间不会有足够的时间,只有最后一个才会被发射。

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

关于java - rxJava debounce() 运算符不适用于 Observable.range(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47730191/

相关文章:

android - tablayout 选项卡中的文本被截断

android - 我如何初始化新版本的 crashlytics?

android - RxJava 运算符 Debounce 不起作用

java - RxJava2 可观察背压

java - 如何将 completablefuture 转换为 Rxjava?

java - 在特定时间启动我的 Phonegap 应用程序(闹钟)

java - 使用 PDFBox jar 文件打印 PDF 文件

java - 获取 InterruptedException 以忽略中断

java - 帮助在 Tomcat 5.5.x 中使用嵌入式 JBoss 配置 JNDI

Android Studio 与 Protobuf 集成