美文网首页
RxJava的基础使用

RxJava的基础使用

作者: 爱我O就直说 | 来源:发表于2020-01-15 11:18 被阅读0次

RxJava的几种常见基础使用,自己的学习记录

1、RxJava 延迟执行
2、计时器:
3、倒计时:以获取验证码为例
4、合并操作:如登录页面 登录按钮 是否可点击(需要满足一定条件):

注意:返回的mDisposable 别忘记在onDestory里关掉;如果一个页面有多个Disposable可用管理器CompositeDisposable统一关掉,先添加add(),然后退出时clear()关掉全部。这个CompositeDisposable可以直接写在基类统一处理。
//方法一:在页面里单个处理
    private Disposable mDisposable;

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mDisposable != null && !mDisposable.isDisposed()) {
            mDisposable.dispose();
            mDisposable = null;
        }
    }

//方法二:在基类里统一处理 ,子类使用时调用addDisposable就行了
    private CompositeDisposable compositeDisposable;

    protected void addDisposable(@NonNull Disposable... ds) {
        if (compositeDisposable == null) compositeDisposable = new CompositeDisposable();
        compositeDisposable.addAll(ds);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (compositeDisposable != null) {
            compositeDisposable.clear();
        }
    }
1、RxJava 延迟执行
    //延迟5秒执行
    private void test() {
      mDisposable = Observable.timer(5, TimeUnit.SECONDS).
                subscribeOn(Schedulers.io()).
                observeOn(AndroidSchedulers.mainThread()).
                subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        /**
                         * 延迟后要做的事情
                         */
                    }
                });
    }
2、计时器:
  private void test() {
        /**
         * 间隔  从0开始递增
         * 参数说明:延迟发送时间、间隔时间、时间单位
         */
        Observable.interval(0, 1, TimeUnit.SECONDS).
                subscribeOn(Schedulers.io()).
                observeOn(AndroidSchedulers.mainThread()).
                subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        tv.setText(aLong + "");
                    }
                });
    }
3、倒计时:以获取验证码为例
 //获取验证码
    private void initGetCode() {
        final long time = 60; //倒计时时间
        getCode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                getCode.setEnabled(false);
                getCode.setBackgroundColor(Color.parseColor("#999999"));

                /**
                 * 间隔范围
                 *
                 * 参数说明:long start, long count, long initialDelay, long period, TimeUnit unit
                 * 参数一:从几开始(发送都是递增的)
                 * 参数二:发送多少次
                 * 参数三:延迟多久发送
                 * 参数四:间隔多久发送一次
                 * 参数五:时间单位,这里传的 秒
                 */
                 mDisposable = Observable.intervalRange(0, time + 1, 0, 1, TimeUnit.SECONDS).
                        subscribeOn(Schedulers.io()).
                        observeOn(AndroidSchedulers.mainThread()).
                        subscribe(new Consumer<Long>() {
                            @Override
                            public void accept(Long aLong) throws Exception {
                                getCode.setText(time - aLong + "");
                                //倒计时完成
                                if (aLong == time) {
                                    getCode.setEnabled(true);
                                    getCode.setText("获取验证码");
                                    getCode.setBackgroundColor(Color.parseColor("#ff0011"));
                                }
                                System.out.println(aLong);
                            }
                        });
            }

        });
    }

4、合并操作:如登录页面 登录按钮 是否可点击(需要满足一定条件):
        tv_login.setEnabled(false);
        tv_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "点击了登录", 1).show();
            }
        });

不用RxJava,可以这样写:

    boolean phoneIsFinsh;
    boolean codeIsFinsh;

    private void isLoginClick() {
        boolean aBoolean = phoneIsFinsh && codeIsFinsh;
        tv_login.setBackgroundColor(Color.parseColor(aBoolean ? "#ff0011" : "#999999"));
        tv_login.setEnabled(aBoolean);
    }


 //设置登录是否可点击
    private void initLoginClickBle() {
        tv_login.setEnabled(false);
        tv_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "点击了登录", 1).show();
            }
        });

       
                ed_phone.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                    }

                    @Override
                    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
//                        emitter.onNext(charSequence.length() == 11);
                        phoneIsFinsh = charSequence.length() == 11;
                        isLoginClick();
                    }

                    @Override
                    public void afterTextChanged(Editable editable) {
                    }
                });
     
     
                ed_input_code.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    }

                    @Override
                    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
//                        emitter.onNext(charSequence.length() == 4);
                        codeIsFinsh = charSequence.length() == 4;
                        isLoginClick();
                    }

                    @Override
                    public void afterTextChanged(Editable editable) {
                    }
                });
                
    }

用RxJava,可以这样写:

    //设置登录是否可点击
    private void initLoginClickBle() {
        tv_login.setEnabled(false);
        tv_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "点击了登录", 1).show();
            }
        });

        Observable<Boolean> observable1 = Observable.create(new ObservableOnSubscribe<Boolean>() {
            @Override
            public void subscribe(final ObservableEmitter<Boolean> emitter) throws Exception {
                ed_phone.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                    }

                    @Override
                    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                        emitter.onNext(charSequence.length() == 11);
//                        phoneIsFinsh = charSequence.length() == 11;
//                        isLoginClick();
                    }

                    @Override
                    public void afterTextChanged(Editable editable) {
                    }
                });
            }
        });
        Observable<Boolean> observable2 = Observable.create(new ObservableOnSubscribe<Boolean>() {
            @Override
            public void subscribe(final ObservableEmitter<Boolean> emitter) throws Exception {
                ed_input_code.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    }

                    @Override
                    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                        emitter.onNext(charSequence.length() == 4);
//                        codeIsFinsh = charSequence.length() == 4;
//                        isLoginClick();
                    }

                    @Override
                    public void afterTextChanged(Editable editable) {
                    }
                });
            }
        });

        //如果是有3个及以上的条件,可以用 Function3/4/5...9
        Observable.combineLatest(observable1, observable2, new BiFunction<Boolean, Boolean, Boolean>() {
            @Override
            public Boolean apply(Boolean aBoolean, Boolean aBoolean2) throws Exception {
                return aBoolean && aBoolean2;
            }
        }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                tv_login.setBackgroundColor(Color.parseColor(aBoolean ? "#ff0011" : "#999999"));
                tv_login.setEnabled(aBoolean);
            }
        });

    }

相关文章

网友评论

      本文标题:RxJava的基础使用

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