正文
看下验证用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); }