java实现debounce_Rxjava debounce 操作符

java实现debounce_Rxjava debounce 操作符Debounce1.官方定义onlyemitanitemfromanObservableifaparticulartimespanhaspassedwithoutitemittinganotheritemTheDebounceoperatorfiltersoutitemsemittedbythesourceObservablethatare…

大家好,又见面了,我是你们的朋友全栈君。

Debounce

1.官方定义

only emit an item from an Observable if a particular timespan has passed without it emitting another item

79a2fbba080398160f0ec45ac170a3b9.png

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中使用场景

快速点击按钮,执行某个操作。

b201f42e2d80259753175d0604741c86.png

edb54b757656e3a1cff79e73c4751b5c.png

比如美团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.net/151572.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月20日 上午7:16
下一篇 2022年6月20日 上午7:16


相关推荐

  • NetApp存储术语介绍

    NetApp存储术语介绍存储存储即为在不同场场景内采用合理 安全 有效的方式将数据保存在某个介质中 同时也能保证数据被有效的访问和使用 简单说就是两个方面 1 安全有效的长期或者临时保存在某个媒介中 2 保证数据完整有效的存放并通过简单有效的手段访问常见的存储方式 DAS Directattach 直接附属存储 顾名思义为直连存储 简单架构为将存储直接通过点到点的方式直接连接在服务器上 NAS Networkattac 网络附属存储 顾名思义为通过网络 TCP IP 形式与存储连

    2026年3月20日
    2
  • java testng接口测试_如何利用TestNG做接口自动化测试?Java+TestNG测试实例分享

    java testng接口测试_如何利用TestNG做接口自动化测试?Java+TestNG测试实例分享上一篇自动化测试我们大概了解了测试的目标 测试的技术选型以及搭建平台的目标及需求 也确定了自动化测试方案以 testNg 作为整个测试流程贯穿的基础支持框架 那么 testNg 究竟有什么特点 本篇开始我们来详细的学习 testNg 这个测试框架 为什么要用 testNg 首先我们学习之前 先思考一个问题 java 测试的框架很多 为什么要用 testNg 呢 比如 junit 使用的人很多 几乎所有 java 开发人员都

    2026年3月17日
    2
  • 【Pycharm】主题背景颜色更改

    【Pycharm】主题背景颜色更改近日在家使用 Pycharm 时 由于家里环境原因 电脑常常会迎着日光放置 导致使用深色主题的 IDE 很容易导致视觉疲劳 因此想要换一个 Pycharm 的背景 更换方式 1 打开 Pycharm 的 File 点击 Settings 即文件 设置 PS 我的 Pycharm 是 2019 3 1 版本的 虽然绝大多数版本的 Pycharm 都没有更换布局 但是给出参考为好 2 在 Settings 中找到 Appearance 点击里面的 Theme 即可选择不同的界面风格

    2026年3月27日
    2
  • js全局变量在其他方法中赋值后无法影响到该方法外的全局变量的值(奇葩问题)

    js全局变量在其他方法中赋值后无法影响到该方法外的全局变量的值(奇葩问题)做个笔记,以防忘记遇到一个奇葩问题(书写规范不会遇到此问题)问题描述:$(document).ready(function(){varstrCookie=document.cookie;username=”1″;if(strCookie){cookieVariables=strCookie.split(“;”);

    2022年5月5日
    51
  • ORA-00904: 标识符无效解决方案(oracle 00904)

    ORA-00904: 标识符无效解决方案(oracle 00904)原因这是由于引用了不存在的列 或者在 SELECT 语句中引用了无效的别名造成的 这也可能意味着你在不需要的时候使用了引号 我们可以检查这个作为下面解决方案的一部分 解决方案检查列名是否在你所引用的表中 在引用列时 检查是否引用了正确的别名 检查列是否使用了正确的表别名 例如 如果 department 表的别名为 dept 那么它应该是 dept department id 而不是 sup department id 检查是否在 WHERE 子句中引用列别名 检查列名是否小

    2026年3月16日
    3
  • “建议所有公司把程序员全裁掉!” OpenClaw爆火,六位资深“养虾人”自述与AI共生

    “建议所有公司把程序员全裁掉!” OpenClaw爆火,六位资深“养虾人”自述与AI共生

    2026年3月12日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号