RxJava2操作符

RxJava2操作符之“Debounce”

2017-04-14  本文已影响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也被发射了出来。

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

总结

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

上一篇 下一篇

猜你喜欢

热点阅读