RxJava实例-用debounce实现的简单即时搜索

来源:互联网 发布:html编程 编辑:程序博客网 时间:2024/06/13 18:39

效果图


debounce.gif

说明

运用debounce操作符进行文本搜索,输入单个字符并不会触发搜索,而是在等待一定时间后才触发搜索。

debounce


image.png

上面这个图并不是很直观,换一个图


image.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。

源代码

Demo地址:https://github.com/jiangkang/KTools.git

原创粉丝点击