为防止用户在数据加载的时候接连点击按钮造成数据混乱,我们可以用RxJava的形式实现按钮的点击事件,使用户在你规定的时间内再次点击按钮无效。

实现

1.首先引入RxJava2

implementation "io.reactivex.rxjava2:rxjava:2.1.17"

implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

2.创建一个接口,里面设置一个方法用于点击事件时触发

public interface MyClickListener {

void onClick(View view);

}

3.封装一个proxyOnClickListener()方法,此方法用于代替之前的点击事件方法

public void proxyOnClickListener(int seconds, final View view, final MyClickListener myClickListener)

//seconds:表示点击按钮的时间间隔,在此间隔内点击按钮会使点击无效

//view:传进来的控件

//myClickListener:我们自己构建的接口,需实现其中的onClick(View view)方法,表示点击时触发的事件

4.创建ObserveOnSubscribe对象,此对象是Obsarveble创建时需要传入的对象

ObservableOnSubscribe subscribe = new ObservableOnSubscribe() {

@Override

public void subscribe(final ObservableEmitter emitter) throws Exception {

view.setOnClickListener(new View.OnClickListener() {//view是我们传进来的view参数

@Override

public void onClick(View v) {

emitter.onNext(view);//将view发送给观察者,在观察者中实现我们接口中的onClick()方法

}

});

}

};

5.创建观察者Observer

Observer observer = new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(View view) {

myClickListener.onClick(view);//view是被观察者传过来的view,在这里调用接口中的方法

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

};

6.观察

Observable

.create(subscribe)//这是我们创建的ObserveOnSubscribe对象

.throttleFirst(seconds,TimeUnit.SECONDS)//这句很关键,这是RxJava中的操作符,在规定时间内观察者不在接收被观察者发送的事件

.subscribe(observer);

7.完整的proxyOnClickListener方法

public void proxyOnClickListener(int seconds, final View view, final MyClickListener myClickListener){

ObservableOnSubscribe subscribe = new ObservableOnSubscribe() {

@Override

public void subscribe(final ObservableEmitter emitter) throws Exception {

view.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

emitter.onNext(view);

}

});

}

};

Observer observer = new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(View view) {

myClickListener.onClick(view);

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

};

Observable

.create(subscribe)

.throttleFirst(seconds,TimeUnit.SECONDS)

.subscribe(observer);

}

8.调用

proxyOnClickListener(2, button, new MyClickListener() {

@Override

public void onClick(View view) {

Log.d(TAG, "onClick: ");

}

});

当我们点击按钮时会发现,在你第一次点击按钮的2秒内再次点击按钮,并不会打印log日志,说明我们的点击事件是无效的(其实OnClickListener中的onClick()方法是调用了,不过在其中 emitter.onNext(view)发送的view并未被观察者接收)

源码

源码

java 双击触发事件,用RxJava2的方式实现点击事件相关推荐

  1. 关于Echarts柱状图点击事件的实现方法charsjs柱状图点击事件

    关于Echarts柱状图点击事件的实现方法 charsjs柱状图点击事件 ajax请求数据 var chartDom = document.getElementById('riskmain'); va ...

  2. 基础复习——Button——按钮——触发事件——监听器(单独公共)——点击事件与长按事件——禁用恢复按钮...

    按钮控件Button由TextView派生而来,它们之间的区别有: (1)Button拥有默认的按钮背景,而TextView默认无背景: (2)Button的内部文本默认居中对齐,而TextView的 ...

  3. 安卓java代码标签_Android实现动态添加标签及其点击事件

    在做Android开发的时候,会遇到动态添加标签让用户选择的功能,所以自己写了个例子,运行效果图如下. 标签可以左右滑动进行选择,点击的时候,会弹出toast提示选择或者取消选择了哪个标签.通过动态添 ...

  4. 注册事件的两种方式(传统注册事件、方法监听注册事件)

    注册事件的两种方式 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...

  5. swift3 按钮触发事件_swift5.3 UIView 与 UIButton 点击事件传递参数

    UIView 与 UIbutton 点击事件的参数传递:目前我通过 tag 解决了 UIButton 的点击参数传递 设置 UIButton 的 tag,详细见代码let playButton = U ...

  6. touch事件总结,监听屏幕点击事件

    Touch对象--MDN TouchEvent--MDN 一.问题背景 click事件在移动端的300毫秒延迟问题 当需要监听诸如左滑.右滑之类的事件 二.知识点概括 1. 事件类型 touchsta ...

  7. vue中设置子组件的点击事件不影响父组件的点击事件

    " 大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂. " 今天分享个技术块儿. 在做项目的过程中,遇到了个问题,简单的描述一下:有一个card卡片,上面绑定了个点击事件,点击c ...

  8. php 列表 单击事件,首页gt; PHPgt;如何添加点击事件到jstree的(jQuery插件)异步列表?...

    我想将点击事件添加到jstree的异步列表项中. 理想的结果是:当我单击jstree中的项目时,该项目的内容将作为参数传输到sql查询,然后执行该查询并在同一页或另一页中显示结果集. 虽然我不知道如何 ...

  9. 【Echarts图例点击事件】自定义Echarts图例legend点击事件(已解决)

    目录 先睹为快(效果) 1.实现Echarts多条曲线 2.点击echarts触发接口请求 2.1 先默认隐藏部分数据 2.2 自定义legend图例点击事件 3.源码下载地址(解压即用) **[写在 ...

最新文章

  1. python字典排序取最值总结
  2. 深度学习核心技术精讲100篇(十四)-一文带你看懂GPflow的前世今生
  3. php 利用http上传协议(表单提交上传图片 )
  4. 让用户感到体贴登录页设计灵感
  5. mysql 5.5.35 单机多实例配置详解_基于mysql-5.5.32的单机多实例多配置文件的
  6. 工程师,你的钱究竟从哪来?
  7. python可以给你干什么-你最想用python做什么?python到底能用来做什么?
  8. 我的前半生之六,创业维艰,我不想骂你,你滚吧
  9. LA 3713 Astronauts
  10. Annotation-specified bean name conflicts with existing
  11. ambari hdfs 启动报错_Ambari 1.6 自动安装hadoop 2.2.0 在Ambari启动namenode时报错
  12. Java核心技术卷一基础知识第10版demo实例
  13. 《精通linux设备驱动程序开发》——视频驱动程序
  14. 【优化】py2下hbase的字符串编码问题(\\xe7\\xbc\\x96)
  15. Android 开源项目PhotoView遇到问题
  16. envoy网络安全opa等
  17. 深度学习:学习路线与规划
  18. 转载:AMDCPU规格功耗列表-最近要设计低功耗机器,留存参考。
  19. android 4.4 hifi,海贝(HiBy)R5安卓高解析无损播放器 4.4平衡随身听便携HIFI 双向蓝牙 铝合金黑色...
  20. Android Weekly #32 - 面对畏惧之人,便说笨方法是行动的勇敢

热门文章

  1. git之配置在Terminal显示git分支
  2. redis集群和主从配置
  3. linux的manual手册不存在,在 Linux 命令行下使用“原力”
  4. wxpython frame鼠标拖动_Python wxpython模块响应鼠标拖动事件操作示例
  5. python 文件和目录操作题库
  6. 第十三天-企业应用架构模式-对象-关系元数据映射模式
  7. Widows下TortoiseGit登录密码错误
  8. CommonLibrary——框架通用工具库
  9. 【李宏毅2020 ML/DL】P34 More about explainable AI | Attribution, Heatmap, explainable model
  10. 2.JAVA基础——数据类型、变量及运算符