java实现debounce_Rxjava debounce 操作符
大家好,又见面了,我是你们的朋友全栈君。
Debounce
1.官方定义
only emit an item from an Observable if a particular timespan has passed without it emitting another item
The Debounce operator filters out items emitted by the source Observable that are rapidly followed by another emitted item.
2.API
public final Observable debounce(long timeout, TimeUnit unit); //默认执行线程 Schedulers.computation()
public final Observable debounce(long timeout, TimeUnit unit, Scheduler scheduler);
3.Android中使用场景
快速点击按钮,执行某个操作。
比如美团APP中的选择套餐:由左图的0份快速点击到右图的7份,然后根据选中份数计算总价。
4.代码实现一
//NumberPickerView.java
…
plusView.setOnClickListener(v- >{
selectCount++;
countTv.setText(selectCount+ “”);
onChangeListener.onChange(dealId, selectCount);//dealId为当前套餐的id
});public interfaceOnChangeListener {
onChange(int dealId, intselectCount);
}
//activity
…
numberPickerView.setOnChangeListener((dealId, selcetCount)->{
calculateDealPrice(dealId, selectCount);
});private calculateDealPrice(int dealId, intselectCount) {
…//计算价格
}
对于这种快速点击,我们其实需要的是对第7次进行计算,中间的一系列暂存态是没必要计算的,使用debounce来解决。
5.代码实现二:增加debounce操作
RxView.clicks(plusView)
.map(aVoid->{
selectCount++;
countTv.setText(selectCount+ “”);returnselectCount;
}
.debounce(400, TimeUnit.MILLISECONDS))
.observeOn(AndroidSchedulers.mainThread())
.subcribe(count-> onChangeListener.onChange(dealId, selectCount), Throwable::printStackTrace);
缺点:
1.NumberPickerView依赖了 com.jakewharton.rxbinding:rxbinding:x.x.x
2.NumberPickerView中plusView被强制增加了400ms的debounce操作
5.代码实现三:将debounce操作移出NumberPickerView
//NumberPickerView.java
…
plusView.setOnClickListener(v- >{
selectCount++;
countTv.setText(selectCount+ “”);
onChangeListener.onChange(dealId, selectCount);//dealId为当前套餐的id
});
//activity
…
PublishSubject subject =PublishSubject.create();
numberPickerView.setOnChangeListener((dealId, selectCount)->{
subject.onNext(newSelectParams(dealId, selectCount));
});
subject.debounce(400, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(selectParams->calculateDealPrice(selectParams.dealId, selectParams.selectCount), Throwable::printStackTrace);classSelectParams {intdealId;intselectCount;
SelectParams(int dealId, intselectCont) {this.dealId =dealId;this.selectCount =selectCount;
}
}private calculateDealPrice(int dealId, intselectCount) {
…//计算价格
}
此时NumberPickerView不再依赖第三方库,适用性提高。
参考:http://reactivex.io/documentation/operators.html
原文:http://www.cnblogs.com/ruyingxiangsui/p/6082777.html
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151572.html原文链接:https://javaforall.cn
相关文章
- java vo 什么意思_在Java中VO , PO , BO , QO, DAO ,POJO是什么意思
- java怎么调用.asmx_Java调用Webservice(asmx)的例子
- java 104规约_IEC104规约,Java开发主站程序
- java怎么输出保留两位小数_剖析Java输出怎么保留两位小数「建议收藏」
- java代码大全及详解_Java练级攻略[通俗易懂]
- java.lang.RuntimeException: Can not toast on a thread that has not called Looper.prepare()终极解决方案
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- java redis锁_Java中Redis锁的实现[通俗易懂]
- java axis_Java 使用Axis实现WebService实例
- java平均的随机数_Java 随机数详解「建议收藏」
- java后台怎么解密md5,Java md5 密码加解密
- java生成license_使用truelicense实现用于JAVA工程license机制(包括license生成和验证)…
- java 读取字符串文件_Java读取文件为字符串
- java 文件上传到服务器_Java上传文件到服务器端的方法「建议收藏」
- java date当前时间_JAVA中获取当前系统时间
- java 舆情分析_基于Java实现网络舆情分析系统研究与实现.doc[通俗易懂]
- java 异或加密_Java异或技操作给任意的文件加密原理及使用详解
- Java 连接 MySQL 数据库简易实现(java连mysql)
- Oracle 视图 ALL_JAVA_FIELDS 官方解释,作用,如何使用详细说明
- Linux 升级Java:新版本带来的变化(linux升级java)
- MySQL与Java的结合:实现强大的数据持久化功能(mysql与java)
- Java调用Redis实现高性能数据存储(java调用redis)
- Java Redis一次实现无限数据加速的尝试(用java redis)
- Java技术将数据写入Oracle数据库(java写入oracle)
- Java实现Redis计数器功能(redis计数 java)