专栏名称: 刘望舒
腾讯云最具价值专家
目录
相关文章推荐
复利大王  ·  青岛大所女律师cg事件 ·  3 小时前  
复利大王  ·  复旦大四小迷妹,被交大phd海王pua ·  3 小时前  
复利大王  ·  某国资PE:月入6k你玩什么命啊! ·  昨天  
复利大王  ·  wtf,金融机构一个比一个乱 ·  昨天  
复利大王  ·  坏了!突然被老板表白了 ·  昨天  
51好读  ›  专栏  ›  刘望舒

RxBinding使用和源码解析

刘望舒  · 掘金  · android  · 2018-01-02 04:08

正文

请到「今天看啥」查看全文


看下验证用RxBinding的方式是怎么实现的,看之前先了解一下 combineLatest 这个操作符。这个操作符可以结合两个 Observable 的数据源进行输出,这个正好我们这里需要验证输入的Name和Password两个数据源,验证通过才让按钮可以点击登录。看下 RxJava 官方的一个解释图:

这个和 zip 操作符还是有点不一样,在第一个数据源没有发送数据,会取最近的数据和第二个数据源进行结合发送,比如途中的 2C / 2D / 3D 等等

言归正传,有了上面的储备,就可以愉快看下表单验证的实现了,如果输入的名字"RxBind",密码"123",就会在 subscribe 中接收到 aBoolean ==true,然后我们在使能按钮, RxView.clicks 这个可以先忽略,我们在第二部分进行详细说明。

private void rxEditText() {        Observable.combineLatest(RxTextView.textChanges(mEditName).map(new Function<CharSequence, String>() {            @Override            public String apply(CharSequence charSequence) throws Exception {                return String.valueOf(charSequence);            }        }), RxTextView.textChanges(mEditPwd).map(new Function<CharSequence, String>() {            @Override            public String apply(CharSequence charSequence) throws Exception {                return String.valueOf(charSequence);            }        }), new BiFunction<String, String, Boolean>() {            @Override            public Boolean apply(String name, String password) throws Exception {                return isNameValid(name) && isPwdValid(password);            }        }).subscribe(new Consumer<Boolean>() {            @Override            public void accept(Boolean aBoolean) throws Exception {                if (aBoolean) {                    mBtnLogin.setEnabled(true);                    RxView.clicks(mBtnLogin).subscribe(new Consumer<Object>() {                        @Override                        public void accept(Object o) throws Exception {                            Toast.makeText(MainActivity.this, "Login Success!", Toast.LENGTH_SHORT).show();                        }                    });                }            }        });    }    private boolean isNameValid(String name) {        return "RxBind".equals(name);    }    private boolean isPwdValid(String pwd) {        return "123".equals(pwd);    }

整个验证过程很是流程,一撸到底丝绸般润滑。如果用老套路会有嵌套的ifelse,很难看。看下点击效果:

2.按钮点击分发多个事件

老套路的按钮点击事件想必大家都烂熟于胸了,看下上面 RxBinding 按钮点击是什么姿势, mBtnLogin 就是按钮。

RxView.clicks(mBtnLogin).subscribe(new Consumer<Object>() {            @Override            public void accept(Object o) throws Exception {                Toast.makeText(MainActivity.this, "Login Success!", Toast.LENGTH_SHORT).show();            }        });

有小伙伴就要摔桌子了,这没比 setOnClickListener 简单啊,还更复杂,你是不是在骗我。。。。

先等等,听我解释,如果要实现多个监听呢?就是点击了一个按钮在多个地方收到通知,怎么玩?

这个用 RxBinding 就很简单了,看下Code:

1. RxView.clicks(mBtnEvent).share() 首先需要使用share这个操作符2.通过 CompositeDisposable 订阅多个 Disposable

private void rxButton() {        Observable<Object> observable = RxView.clicks(mBtnEvent).share();        CompositeDisposable compositeDisposable = new CompositeDisposable();        Disposable disposable1 = observable.subscribe(new Consumer<Object>() {            @Override            public void accept(Object o) throws Exception {                Log.d(TAG, "disposable1, receive: " + o.toString());            }        });        Disposable disposable2 = observable.subscribe(new Consumer<Object>() {            @Override            public void accept(Object o) throws Exception {                Log.d(TAG, "disposable2, receive: " + o.toString());            }        });         compositeDisposable.add(disposable1);        compositeDisposable.add(disposable2);    }






请到「今天看啥」查看全文


推荐文章
复利大王  ·  青岛大所女律师cg事件
3 小时前
复利大王  ·  复旦大四小迷妹,被交大phd海王pua
3 小时前
复利大王  ·  某国资PE:月入6k你玩什么命啊!
昨天
复利大王  ·  wtf,金融机构一个比一个乱
昨天
复利大王  ·  坏了!突然被老板表白了
昨天
十点读书  ·  遇到你之前,我从没期待过余生
8 年前
诗词天地  ·  泰戈尔:明白这一点,让自己快乐
8 年前
腾讯游戏频道  ·  LOL S7小组赛:EDG遭SKT翻盘 WE取首胜
7 年前