添加相应的依赖(按需添加):
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.防止按钮重复点击
利用操作符throttleFirst取时间间隔内第一次点击事件
同样利用操作符throttleLast、debounce也可以实现。
RxView.clicks(mBt)
.throttleFirst(1, TimeUnit.SECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Log.i(TAG, "----button clicked----");
}
});
2.监听EditText文本
RxTextView.textChanges(mEditName)
.map(new Function<CharSequence, String>() {
@Override
public String apply(CharSequence charSequence) throws Exception {
return String.valueOf(charSequence);
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
});
3.表单验证
操作符combineLatest作用就是当多个Observables中的任何一个发射了一个数据时,通过一定的方法去组合多个Observables的最新数据,然后发射最终结果。
在本例中两个输入框只要内容发生变化,就会发送Observable然后我们在Fun2中利用我们的验证方法去判断输入框中最新的内容,最终返回是否可点击的结果。
private void initViews() {
Observable<CharSequence> ObservableName = RxTextView.textChanges(mEtPhone);
Observable<CharSequence> ObservablePassword = RxTextView.textChanges(mEtPassword);
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(mBtLogin).call(aBoolean);
}
});
RxView.clicks(mBtLogin)
.throttleFirst(1, TimeUnit.SECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Toast.makeText(LoginActivity.this, "登录成功!" ,Toast.LENGTH_SHORT).show();
}
});
}
private boolean isPhoneValid(String phone) {
return phone.length() == 11;
}
private boolean isPasswordValid(String password) {
return password.length() >= 6;
}
4、按钮点击分发多个事件
按钮点击事件
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();
}
});
按钮点击事件分发
1.RxView.clicks(mBtnEvent).share()首先需要使用share这个操作符
2.通过CompositeDisposable订阅多个Disposable
3.INSTANCE其实是RxBinding默认发送的数据,可以忽略
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);
}
5、ListView点击事件
通过RxAdapterView.itemClicks(mListView)封装了一个Observable,就可以在点击的时候进行回调了
private void rxList() {
ArrayList<String> datas = new ArrayList<>();
for (int i = 0; i < 10; i++) {
datas.add("rxList " + i);
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1, datas);
mListView.setAdapter(adapter);
RxAdapterView.itemClicks(mListView).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Toast.makeText(MainActivity.this, "List Item Clicked, Position = " + integer, Toast.LENGTH_LONG).show();
}
});
}
6、获取验证码倒计时
public class RegisterActivity extends AppCompatActivity {
private static String TAG = "RegisterActivity";
@BindView(R.id.bt)
Button mBt;
private Observable<Void> verifyCodeObservable;
private static int SECOND = 20;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
ButterKnife.bind(this);
initViews();
}
private void initViews() {
verifyCodeObservable = RxView.clicks(mBt)
.throttleFirst(SECOND, TimeUnit.SECONDS) //防止20秒内连续点击,或者只使用doOnNext部分
.subscribeOn(AndroidSchedulers.mainThread())
.doOnNext(new Action1<Void>() {
@Override
public void call(Void aVoid) {
RxView.enabled(mBt).call(false);
}
});
verifyCodeObservable.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Observable.interval(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.take(SECOND)
.subscribe(new Observer<Long>() {
@Override
public void onCompleted() {
RxTextView.text(mBt).call("获取验证码");
RxView.enabled(mBt).call(true);
}
@Override
public void onError(Throwable e) {
Log.e(TAG, e.toString());
}
@Override
public void onNext(Long aLong) {
RxTextView.text(mBt).call("剩余" + (SECOND - aLong) + "秒");
}
});
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
verifyCodeObservable.unsubscribeOn(AndroidSchedulers.mainThread()); //防止泄露
}
}