美文网首页Android进阶
RxJava 响应请求

RxJava 响应请求

作者: 成小知 | 来源:发表于2017-09-15 16:10 被阅读97次

我们时常有会碰到这种情形:在一个EditText中,并且针对该文本:当我输入时,一个响应将被自动触发,从而打印出我输入的文本,或者现在这样的反应被称为一个API的调用。所以,如果我们输入的每一个字符做出的这种反应将是一种浪费,因为我们只想需要知道最后一个输入,这意味着在我停止打字的时候它应该只触发一个call!


example.gif

传统解决方法

我用一个定时器,并且安排它在afterTextChanged()方法延时1000毫秒后调用run()方法

  //Java
Timer timer = new Timer();

final TextView textView = (TextView) findViewById(R.id.textView);
final EditText editText = (EditText) findViewById(R.id.editText);

editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
                                  int after) {
    }

    @Override
    public void onTextChanged(final CharSequence s, int start, int before,
                              int count) {
        if (timer != null)
            timer.cancel();
    }

    @Override
    public void afterTextChanged(final Editable s) {
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("Output : " + editText.getText());
                    }
                });
            }

        }, 1000);
    }
});

使用RxJava

1.创建一个observable
2.添加Debounce operator,1000毫秒(1秒)的延迟
3.订阅它

  Observable.create(new Observable.OnSubscribe<String>() {
                    @Override
                    public void call(final Subscriber<? super String> subscriber) {
                        editText.addTextChangedListener(new TextWatcher() {
                            @Override
                            public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
                            }

                            @Override
                            public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
                                subscriber.onNext(s.toString());
                            }

                            @Override
                            public void afterTextChanged(final Editable s) {
                            }
                        });
                    }
                })
                .debounce(1000, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(final String s) {
                        textView.setText("Output : " + s);
                    }
                });

更少的样板——RxBindings!

我们可以使用RxBindings——这是RxJava结合了Android的UI组件的API。

  RxTextView.afterTextChangeEvents(editText)
              .debounce(1000,TimeUnit.MILLISECONDS)
              .observeOn(AndroidSchedulers.mainThread())
              .subscribe(tvChangeEvent -> {
                 textView.setText("Output : " + tvChangeEvent.view()
                            .getText());
              });

相关文章

  • RxJava 响应请求

    我们时常有会碰到这种情形:在一个EditText中,并且针对该文本:当我输入时,一个响应将被自动触发,从而打印出我...

  • 动脑学院Rxjava预习资料 RxJava2 响应式编程介绍

    RxJava2 响应式编程介绍 响应式编程&RxJava基本概念响应式宣言响应式扩展响应式流规范 RxJava 基...

  • RxAndroid入门

    响应式编程 RxJava提供了响应式编码规范,而RxAndroid是专供Android平台的RxJava(只是针对...

  • Android开发常用框架汇总(转)

    响应式编程 RxJava https://github.com/ReactiveX/RxJava RxAndroi...

  • RXjava(一)

    rxjava 响应式变成,自然好处多多在,这里不做更多解释。 Rxjava、RxAndroid Rxjava : ...

  • RxJava学习笔记

    RxJava RxJava是响应式程序设计的一种实现。在响应式程序设计中,当数据到达的时候,消费者做出响应。响应式...

  • 网络教程

    http协议包括 请求协议:请求行、请求头、请求体 响应协议:响应行、响应头、响应体 servlet

  • http协议

    http协议包含内容 请求 请求头 请求行 请求正文 响应 响应头 响应行 响应正文image.png

  • Android函数响应式编程最新RxJava-操作符入门(2)

    Android函数响应式编程最新RxJava-基本用法Android函数响应式编程最新RxJava-操作符入门(1...

  • 接口测试(一)

    http协议内容 请求请求头请求行请求正文 响应响应头响应行响应正文 请求正文数据格式键值对XMLJSON 熟悉项...

网友评论

    本文标题:RxJava 响应请求

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