Rxbinding github地址
资料来源
Android实战——RxJava2+Retrofit+RxBinding解锁各种新姿势
Rxjava操作符
常用操作符
- interval:延时几秒,每隔几秒开始执行
- take:超过多少秒停止执行
- map:类型转换,由于是倒计时,案例需要将倒计时的数字反过来
- observeOn:在主线程运行
- doOnSubscribe:在执行的过程中
- subscribe:订阅
使用场景
1.放置重复点击
Disposable disposable=RxView.clicks(bDownload)
.throttleFirst(5 , TimeUnit.SECONDS)
.subscribe(new Consumer<Unit>() {
@Override
public void accept(Unit unit) throws Exception {
Toast.makeText(MainActivity.this, "点击了url="+url, Toast.LENGTH_SHORT).show();
}
});
2.多次监听点击事件
Observable<Unit> observable= RxView.clicks(bDownload).share();
Disposable d1 = observable.subscribe(
new Consumer<Unit>() {
@Override
public void accept(Unit unit) throws Exception {
Log.i(TAG, "第一次");
}
});
Disposable s2 = observable
.subscribe(new Consumer<Unit>() {
@Override
public void accept(Unit unit) throws Exception {
Log.i(TAG, "第二次");
}
});
3.点击后获取倒计时
Observable<Unit> observable = RxView.clicks(bDownload).share();
Disposable disposable = observable
.throttleFirst(SECOND, TimeUnit.SECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.doOnNext(new Consumer<Unit>() {
@Override
public void accept(Unit unit) throws Exception {
Toast.makeText(MainActivity.this, "点击了url=" + url, Toast.LENGTH_SHORT).show();
}
})
.compose(this.bindUntilEvent(ActivityEvent.STOP))
.subscribe(new Consumer<Unit>() {
@Override
public void accept(Unit unit) throws Exception {
Observable.interval(1,TimeUnit.SECONDS,AndroidSchedulers.mainThread())
.take(SECOND)
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long aLong) {
String time="剩余"+(SECOND-aLong-1)+"秒";
tvTime.setText(time);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
tvTime.setText("剩余时间");
}
});
}
});
4.把监听事件转换成响应事件
RxView(clicks)、RxTextView(textChanges)、RxAdapterView(itemClicks)、RxCompoundButton(checkChanges)本质上就是对控件做了监听,只是把触发事件转换成了Rxjava类型的事件流
注意事项
依赖问题
不同的依赖库引入了不同的控件可支持的Rxbinding
注,RxBinding包中包含RxJava的内容,所以就无需再添加RxJava的依赖了
截止2019.01.04
- Platform bindings:
implementation 'com.jakewharton.rxbinding3:rxbinding:3.0.0-alpha2'
支持常用的Rxbinding(自带的Weights库)
RxView(clicks)、RxTextView(textChanges)、RxAdapterView(itemClicks)、RxCompoundButton(checkChanges)
支持最新的AndroidX库
(androidx请看这里,具体就是28以后的版本,不在依赖support库,而是把一些新的控件分离到不同的库中,具体见来源资料
- AndroidX library bindings:
implementation 'com.jakewharton.rxbinding3:rxbinding-core:3.0.0-alpha2' implementation 'com.jakewharton.rxbinding3:rxbinding-appcompat:3.0.0-alpha2' implementation 'com.jakewharton.rxbinding3:rxbinding-drawerlayout:3.0.0-alpha2' implementation 'com.jakewharton.rxbinding3:rxbinding-leanback:3.0.0-alpha2' implementation 'com.jakewharton.rxbinding3:rxbinding-recyclerview:3.0.0-alpha2' implementation 'com.jakewharton.rxbinding3:rxbinding-slidingpanelayout:3.0.0-alpha2' implementation 'com.jakewharton.rxbinding3:rxbinding-swiperefreshlayout:3.0.0-alpha2' implementation 'com.jakewharton.rxbinding3:rxbinding-viewpager:3.0.0-alpha2' implementation 'com.jakewharton.rxbinding3:rxbinding-material:3.0.0-alpha2'
还支持material风格的素材库(material库也属于androidX的一部分)
- Google 'material' library bindings:
implementation 'com.jakewharton.rxbinding3:rxbinding-material:3.0.0-alpha2'
如果我们项目依赖的仍是
com.android.support:appcompat-v7,建议只依赖平台路径
androidx.appcompat:appcompat,按照自己的需要(按控件选择)依赖下面的控件Rxbinding库
生命周期和内存管理
注意与Rxlifecycle结合使用
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'
//点击事件,绑定活动/碎片生命周期
//onDestory()自动销毁
Disposable disposable=RxView.clicks(bDownload)
.compose(this.bindToLifecycle())
.subscribe(new Consumer<Unit>() {
@Override
public void accept(Unit unit) throws Exception {
Toast.makeText(MainActivity.this, "点击了url="+url, Toast.LENGTH_SHORT).show();
}
});
//按照生命周期需要来绑定
//这里是在onStop()方法自动停止
//ActivityEvent.STOP是activity的枚举
//FragmentEvent.STOP是fragment的枚举
Disposable disposable=RxView.clicks(bDownload)
.compose(this.bindUntilEvent(ActivityEvent.STOP))
.subscribe(new Consumer<Unit>() {
@Override
public void accept(Unit unit) throws Exception {
Toast.makeText(MainActivity.this, "点击了url="+url, Toast.LENGTH_SHORT).show();
}
});
使用中遇到的问题
问题1:编译时不通过,告警More than one file was found with OS independent path 'META-INF/proguard/androidx-annotations.pro'
解决办法
在gradle文件的defaultConfig中添加代码,类似的代码可以按照相同的方式处理,排除文件重复
defaultConfig {
packagingOptions {
exclude 'META-INF/proguard/androidx-annotations.pro'
}
}