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

效果图

debounce.gif

说明

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

debounce

RxJava实例-用debounce实现的简单即时搜索_第1张图片
image.png

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

RxJava实例-用debounce实现的简单即时搜索_第2张图片
image.png

debounce的意思是“去除抖动”,debounce操作符对源Observable每产生一个结果后,如果在规定的间隔时间内没有别的结果产生,则把这个结果提交给订阅者处理,否则忽略该结果。

主要代码

subscription = Observable
                .create(new Observable.OnSubscribe() {
                    @Override
                    public void call(final Subscriber 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() {
                    @Override
                    public Boolean call(String s) {
                        if (!TextUtils.isEmpty(s)) return true;
                        return false;
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber() {
                    @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

RxJava实例-用debounce实现的简单即时搜索_第3张图片
超光速

你可能感兴趣的:(RxJava实例-用debounce实现的简单即时搜索)