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://bianchenghao.cn/hz/118783.html