RxBing以下内容来源于极客学院讲师课件,仅作为自己记笔记用。
RxBinding简介
RxBinding是基于RxJava,用于绑定android UI的框架。它可以异步获取,并处理控件的各类事件。如:按钮点击事件、
文字变化事件、以及CheckBox选中事件等,android UI等控件按钮的响应事件。
它会将各类的事件由被观察者(Obserable)订阅(subscribe)之后,由订阅者(Subciber)进行处理。RxBinding对监听器的注册和控件的绑定进行了封装。从而使得代码更加的简洁,帮助开发者将更多的精力放在数据处理和业务逻辑上。
RxBinding对各种UI控件的点击事件进行了封装,用户可以直接进行调用。将各种点击监听事件作为参数传递,最终返回一个被观察者,然后用户可以进行调用。使用响应式编程的模式将点击事件转换为事件流,然后将它们进行发出。
RxBinding的使用场景
a.防抖处理:防止抖动操作,手指点击按钮时,误操作点击了按钮多次。可以使用RxBinding捕获事件,防止误操作。
b.选中状态的联动,省市联动的操作。
c.自动补全功能,类似AutoCompleteText控件
代码演示
依赖包
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding-support-v4:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding-design:0.4.0'
测试用例
单击事件按钮
private Button btnTest;
private int i=0;
private Subscription subscription;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnTest=findViewById(R.id.btnTest);
subscription = RxView.clicks(btnTest).throttleFirst(2, TimeUnit.SECONDS).subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Snackbar.make(btnTest,"捕获了"+ ++i+"次点击事件",Snackbar.LENGTH_LONG) .show();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if(subscription!=null){
subscription.unsubscribe();
subscription=null;
}
}
定义Button按钮,RXBinding绑定了点击事件,设置2秒内捕获一次点击事件。模拟多次点击该按钮,在两秒内仅仅捕获一次
点击事件。
定义一个Subcription用于对绑定事件解除绑定,在onDestory中进行释放
长按绑定
RxView.longClicks(btnTest).subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Toast.makeText(MainActivity.this,"长按",Toast.LENGTH_SHORT).show();
}
});
自动补全功能
RxTextView.textChangeEvents(etSearch).debounce(400, TimeUnit.MILLISECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.switchMap(new Func1<TextViewTextChangeEvent, Observable<List<String>>>() {
@Override
public Observable<List<String>> call(TextViewTextChangeEvent textViewTextChangeEvent) {
return getDataFromNet(textViewTextChangeEvent.text().toString().trim()).subscribeOn(Schedulers.io());
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<List<String>>() {
@Override
public void call(List<String> strings) {
initAdapter(strings);
}
});
RxTextView绑定text,400毫秒后响应自动补全的数据。其中switchMap用于数据的转换
联动功能
RxCompoundButton.checkedChanges(checkBox).subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean aBoolean) {
checkBox.setChecked(aBoolean);
btnNext.setBackgroundResource(aBoolean?R.color.colorAccent:R.color.colorPrimary);
}
});
选择后实现联动