美文网首页RxJava2操作符
RxJava2操作符之“Debounce”

RxJava2操作符之“Debounce”

作者: 坑吭吭 | 来源:发表于2017-04-14 11:08 被阅读429次

    作用

    debounce:防抖;
    only emit an item from an Observable if a particular time-span has passed without it emitting another item,
    当一个事件发送出来之后,在约定时间内没有再次发送这个事件,则发射这个事件,如果再次触发了,则重新计算时间。

    应用场景举例

    需求:在Edittext上添加监听,当里面输入的内容变化后进行搜索。换句话说就是当用户的输入操作停止几秒钟之后再去搜索。

    示例原理用法

    先看一下debounce方法的使用方法:

            getObservable()
                    // 设置时间为0.5秒
                    .debounce(500, TimeUnit.MILLISECONDS)
                    // Run on a background thread
                    .subscribeOn(Schedulers.io())
                    // Be notified on the main thread
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(getObserver());//这块观察者不重要
    

    首先模拟一个被观察者

        private Observable<Integer> getObservable() {
            return Observable.create(new ObservableOnSubscribe<Integer>() {
                @Override
                public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                    // send events with simulated time wait
                    emitter.onNext(1); // skip
                    Thread.sleep(400);
                    emitter.onNext(2); // deliver
                    Thread.sleep(505);
                    emitter.onNext(3); // skip
                    Thread.sleep(100);
                    emitter.onNext(4); // deliver
                    Thread.sleep(605);
                    emitter.onNext(5); // deliver
                    Thread.sleep(510);
                    emitter.onComplete();
                }
            });
        }
    

    运行结果

    “2”,“4”,“5”

    分析

    关键部分看被观察者这块;
    第一个事件1发送出来以后过了400毫秒后发送出了第二个事件,此时不事件1不满足时间的条件被遗弃,然后重新计时;
    2发出后休眠了505毫秒,超过了500毫秒,所以2被发射了出来,被观察者收到;
    3发出来后又过了100毫秒4发出来,所以3被遗弃,从4重新计时,后又过了605毫秒下一个事件才发出,所以4被发射了出来;
    同理,5之后的0.5秒内也没有再发出别的事件,所以最终5也被发射了出来。

    类似一个弹簧,如果一个事件相当于挤压它一下的话,它回到初始状态需要一段时间,那如果一直有事件不断的挤压它,那它一直回不到初始状态,就一个事件也弹不出来。一旦有一段时间里面没有人挤压它,他就把最后一个弹出来了。周而复始

    总结

    这个系列只有干货,如果大家有什么好的建议的话欢迎在下面评论。或者觉得我哪里写的不够形象了,同样可以提出来。

    相关文章

      网友评论

        本文标题:RxJava2操作符之“Debounce”

        本文链接:https://www.haomeiwen.com/subject/wolwattx.html