作用
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
也被发射了出来。
类似一个弹簧,如果一个事件相当于挤压它一下的话,它回到初始状态需要一段时间,那如果一直有事件不断的挤压它,那它一直回不到初始状态,就一个事件也弹不出来。一旦有一段时间里面没有人挤压它,他就把最后一个弹出来了。周而复始
总结
这个系列只有干货,如果大家有什么好的建议的话欢迎在下面评论。或者觉得我哪里写的不够形象了,同样可以提出来。