效果图
![](https://img.haomeiwen.com/i1797187/2946b192eede130c.gif)
说明
运用debounce操作符进行文本搜索,输入单个字符并不会触发搜索,而是在等待一定时间后才触发搜索。
debounce
![](https://img.haomeiwen.com/i1797187/eb99c411935bc0c6.png)
上面这个图并不是很直观,换一个图
![](https://img.haomeiwen.com/i1797187/313fd3af812aa47c.png)
debounce的意思是“去除抖动”,debounce操作符对源Observable每产生一个结果后,如果在规定的间隔时间内没有别的结果产生,则把这个结果提交给订阅者处理,否则忽略该结果。
主要代码
subscription = Observable
.create(new Observable.OnSubscribe<String>() {
@Override
public void call(final Subscriber<? super String> subscriber) {
mEtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
subscriber.onNext(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
})
.debounce(500, TimeUnit.MILLISECONDS)
.filter(new Func1<String, Boolean>() {
@Override
public Boolean call(String s) {
if (!TextUtils.isEmpty(s)) return true;
return false;
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
log("subscriber -> onCompleted");
}
@Override
public void onError(Throwable e) {
log("subscriber -> onError ->" + e.getMessage());
}
@Override
public void onNext(String s) {
log(s);
}
});
监听EditView里的文字改变,然后用debounce规定时间间隔为500ms,相隔500ms以上的改变才允许通过输出log。
Github地址
Demo地址:https://github.com/jiangkang/KTools.git
![](https://img.haomeiwen.com/i1797187/55e95b0715680d1e.png)
网友评论