一.Rxbinding的概述:
上一篇文章已经大致介绍过RxBinding的基本情况,这里再叙叙一边:
1.RxBinding是对Android View事件的扩展,让你可以对View事件使用RxJava的各种操作。
2.提供了与RxJava一致的回调,使得代码简洁明了。尤其是页面中充斥着大量的监听事件,各种各样的匿名内部类时。
3.几乎支持我们常用的所有控件及事件。(v4、v7、design、recyclerview等)另外每个库还有对应的Kotlin支持库。
二.RxBinding准备工作
依赖(按需要添加,内部已经依赖RxJava或Rxandroid):
compile 'com.jakewharton.rxbinding:rxbinding:1.0.0'
compile 'com.jakewharton.rxbinding:rxbinding-support-v4:1.0.0'
compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:1.0.0'
compile 'com.jakewharton.rxbinding:rxbinding-design:1.0.0'
compile 'com.jakewharton.rxbinding:rxbinding-recyclerview-v7:1.0.0'
compile 'com.jakewharton.rxbinding:rxbinding-leanback-v17:1.0.0'
三.使用:
1.点击事件使用(防抖动)
TextView tv = (TextView) findViewById(R.id.tv);
RxView.clicks(tv)
.throttleFirst(1, TimeUnit.SECONDS)//防抖动
.subscribeOn(AndroidSchedulers.mainThread())//在主线程生产事件
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Log.e("eee","按钮被点击");
}
});
这是之所以用TextView,来写这个功能是为了告诉大家,不设置点击事件,但按钮被点击,照样执行回掉,猜测是clicks方法里边把这个事情做了
2.点击的多次监听
Android是不能多次监听同一个点击事件。但利用RxJava的操作符,例如share可以实现。而RxBinding恰好支持对点击事件的多次监听。这个说实话我没有用到过,但是总有人需要的,就说一下。
tv = (TextView) findViewById(R.id.tv);
Observable<Void> observable = RxView.clicks(tv).share();
Subscription s = observable.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Log.e("eee", "第一次");
}
});
CompositeSubscription mCompositeSubscription = new CompositeSubscription();
mCompositeSubscription.add(s);
observable.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Log.e("eee", "第二次");
}
});
3.获取验证码倒计时
verifyCodeObservable = RxView.clicks(tv)
.throttleFirst(20, TimeUnit.SECONDS) //防止20秒内连续点击
.subscribeOn(AndroidSchedulers.mainThread())//在主线程内生产事件
.doOnNext(new Action1<Void>() {//在Onnext方法执行前执行
@Override
public void call(Void aVoid) {
RxView.enabled(tv).call(false);//把按钮设置为不可点击
Log.e("eeee","111");
}
});
verifyCodeObservable.subscribe(new Action1<Void>() {//开始订阅
@Override
public void call(Void aVoid) {
Observable.interval(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread())//用来在给定的时间间隔发射从0开始的整数序列
.take(20)//从什么位置开始倒计时
.subscribe(new Observer<Long>() {
@Override
public void onCompleted() {
RxTextView.text(tv).call("获取验证码");//当onNext方法执行完之后,执行
RxView.enabled(tv).call(true);//设置按钮可以被点击
}
@Override
public void onError(Throwable e) {
Log.e("eee", e.toString());
}
@Override
public void onNext(Long aLong) {
RxTextView.text(tv).call("剩余" + (20 - aLong) + "秒");
}
});
}
});
@Override
protected void onDestroy() {
super.onDestroy();
verifyCodeObservable.unsubscribeOn(AndroidSchedulers.mainThread()); //防止泄露
}
4.表单验证
Observable<CharSequence> ObservableName = RxTextView.textChanges(et1);//创建两个内容改变的被观察者
Observable<CharSequence> ObservablePassword = RxTextView.textChanges(et2);
//用一个被观察者,组合成一个被观察者,返回最总结果
Observable.combineLatest(ObservableName, ObservablePassword, new Func2<CharSequence, CharSequence, Boolean>() {
@Override
public Boolean call(CharSequence phone, CharSequence password) {
return isPhoneValid(phone.toString()) && isPasswordValid(password.toString());
}
}).subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean aBoolean) {
//设置按钮能不能被点击
RxView.enabled(btn).call(aBoolean);
}
});
RxView.clicks(btn)
.throttleFirst(1, TimeUnit.SECONDS)//防止手抖
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Toast.makeText(MainActivity.this, "登录成功!", Toast.LENGTH_SHORT).show();
}
});
private boolean isPhoneValid(String phone) {
return phone.length() == 11;
}
private boolean isPasswordValid(String password) {
return password.length() >= 6;
}
需要注意在onDestroy方法时手动的解除订阅,为的就是防止内存泄露