美文网首页已读Android知识Android开发
RxJava实例-用debounce实现的简单即时搜索

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

作者: 姜康 | 来源:发表于2017-05-16 08:49 被阅读774次

效果图

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。

Github地址

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

超光速

相关文章

网友评论

  • doc__wei: 你这能实现?,我也是无语了,,,我用了loading,一直转圈啊
    姜康:git地址已更新
    姜康:效果图都在这,还能骗你不成?把我的代码或者Rx-Android-Demo的代码下载下来跑一遍你就知道了

本文标题:RxJava实例-用debounce实现的简单即时搜索

本文链接:https://www.haomeiwen.com/subject/otgkxxtx.html