美文网首页
RxJava combineLatest操作符的高级使用,实现表

RxJava combineLatest操作符的高级使用,实现表

作者: 全球顶尖伪极客 | 来源:发表于2019-06-20 19:03 被阅读0次

    RxTextView结合combineLatest操作符:

    应用场景:登录时满足所有用户名、密码、验证码等不为空、已勾选复选框的条件下,登录按钮才可以点击。
    说明:监听多个被观察者是否变化,在一个地方进行统一验证,如果验证成功,那么允许用户进行下一步的操作,否则提示用户输入不正确.。
    有任意一个被观察者发生改变时,会去取 其它 Observable 最近一次发射的数据,回调到函数当中。combineLatest就被触发连接几个被观察者进行校验。
    例子:比如以下的两个被观察者,启动APP并没有在用户名和密码输入框中输入数据,但是此时这两个控件已被监听结果为空,相当于所有的Observable都至少发射过一个数据项,监听结果为空直接触发apply事件。输入用户名时被观察者nameObservable发生变化,也能直接触发apply事件。

     private void initFilter() {
            InitialValueObservable<CharSequence> nameObservable = RxTextView.textChanges(userNameEditText);
            InitialValueObservable<CharSequence> pwdObservable = RxTextView.textChanges(userPwdEditText);
            InitialValueObservable<CharSequence> checkBoxObservable = 
    
            Observable.combineLatest(nameObservable, pwdObservable, new BiFunction<CharSequence, CharSequence, Boolean>() {
                @Override
                public Boolean apply(CharSequence charSequence, CharSequence charSequence2) throws Exception {
                    boolean isEnnable = !TextUtils.isEmpty(userNameEditText.getText().toString()) && !TextUtils.isEmpty(userPwdEditText.getText().toString());
                    Log.i(TAG, "apply: " + isEnnable);
    
                    return isEnnable;
                }
            }).subscribe(new Consumer<Boolean>() {
                @Override
                public void accept(Boolean aBoolean) throws Exception {
                    Log.i(TAG, "accept: " + aBoolean);
                    if (aBoolean) {
                        loginButton.setBackgroundColor(0xffFF0000);
                        loginButton.setClickable(true);
                    } else {
                        loginButton.setBackgroundColor(0xff00FF00);
                        loginButton.setClickable(false);
    
                    }
                }
            });
    
     Observable.combineLatest(mobileObservable, passwordObservable, new BiFunction<CharSequence, CharSequence, Object>() {
                @Override
                public Object apply(CharSequence mobile, CharSequence password) throws Exception {
                    Log.d(TAG,"合并事件订阅 "+mobile+"  "+password);
                    //手机号、短信验证码、勾选框 都符合条件时,才允许点击登录
                    if(!TextUtils.isEmpty(mobile) && !TextUtils.isEmpty(password)){
                        loginButton.setClickable(true);
                        loginButton.setBackgroundResource(R.drawable.basic_login_bg02);
                    }else{
                        loginButton.setClickable(false);
                        loginButton.setBackgroundResource(R.drawable.basic_login_bg01);
                    }
    
                    return new Object();
                }
            }).subscribeOn(AndroidSchedulers.mainThread())
                    .observeOn(AndroidSchedulers.mainThread())
                    .as(AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(activityContext, Lifecycle.Event.ON_DESTROY)))
                    .subscribe(new Consumer<Object>() {
                        @Override
                        public void accept(Object o) throws Exception {}
                    });
    
    

    相关文章

      网友评论

          本文标题:RxJava combineLatest操作符的高级使用,实现表

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