Rx_java(7)Rx_java2操作符(throttleFirst、debounce )介绍-防止按钮被重复点击案例
程序员文章站
2024-01-03 17:54:16
...
相关文章
- 观察者模式实例讲解
- 使用java中的类(Observable与Observer)实现观察者模式
- Rx_java2的基本使用
- Rx_java2中的线程控制
- Rx_java2操作符介绍1(Map、Flatmap)
- Rx_java2操作符介绍2(debounce 、filter 、switchMap )
- Retrofit结合RxJava2使用
写在前面
本篇将通过一个实例-防止按钮被重复点击,来讲解Rxjava的一个操作符throttleFirst。
本案列还将使用Rxbinding2来完成。
传统的防止按钮被重复点击的方法
一般来说,我们定义一个变量,保存按钮上次被点击的时间,当按钮被点击时,先获取系统时间,再与上次点击的时间作比较,如果符合再次被点击的条件,则继续
private long currentTim = 0;
public void click(View view){
long systemTime = SystemClock.currentThreadTimeMillis();
if(systemTime - currentTim > 500){
// 与上次点击时间超过500毫秒,则按钮可以点击
// TODO 作按钮点击后的操作
} else {
// 与上次点击的时间少于500毫秒,则按钮不能被点击
}
currentTim = systemTime;
}
Rxjava2方式完成防止按钮被重复点击的操作
我们通过Rxbinding2来绑定空间完成此功能,需要依赖Rxbinding2包
compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
因为Rxbinding2中已经依赖了Rxjava2,所以在我们的build.gradle中不需要再次去依赖Rxjava2的包
首先,我们在布局文件中创建一个按钮
然后通过Rxbinding绑定这个控件。注册起点击事件
RxView.clicks(mButton)
当按钮被点击时,我们需要判断是否与上次点击点击的时间间隔,然后再去响应按钮的点击事件。
所以我们用到了throttleFirst操作符。
throttleFirst操作符
允许设置一个时间长度,之后它会发送固定时间长度内的第一个事件,而屏蔽其它事件,在间隔达到设置的时间后,可以再发送下一个事件。
下面我们在代码中展示throttleFirst的具体用法
mButton = (Button) findViewById(R.id.button);
// 创建观察者
Observer observer = new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object value) {
Log.d("ClickActivity","点击了按钮");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
// 绑定按钮的点击事件,并绑定观察者与被观察者
RxView.clicks(mButton).throttleFirst(1, TimeUnit.SECONDS)
.subscribe(observer);
上面的代码中我们用throttleFirst来使得按钮每间隔1秒才会再次响应其点击事件
// 设置间隔1秒才能发送下一个事件
throttleFirst(1, TimeUnit.SECONDS)
结果演示
从上面的gif图片可以看出,当我快速的点击按钮,但是,起响应事件是间隔1秒才做出响应,当我停止点击按钮,也立即停止了响应。
提示
我们上一节学过了的debounce操作符,可以回头看看debounce,在这里完全就可以用debounce来替代
throttleFirst。
写在后面
本篇通过一个项目中常用的防止按钮重复点击功能来介绍了一个新的操作符throttleFirst、而且还使用了Rxbinding2,关于Rxbinding2,将会令写一篇文章介绍。