java 双击触发事件,用RxJava2的方式实现点击事件
为防止用户在数据加载的时候接连点击按钮造成数据混乱,我们可以用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的方式实现点击事件相关推荐
- 关于Echarts柱状图点击事件的实现方法charsjs柱状图点击事件
关于Echarts柱状图点击事件的实现方法 charsjs柱状图点击事件 ajax请求数据 var chartDom = document.getElementById('riskmain'); va ...
- 基础复习——Button——按钮——触发事件——监听器(单独公共)——点击事件与长按事件——禁用恢复按钮...
按钮控件Button由TextView派生而来,它们之间的区别有: (1)Button拥有默认的按钮背景,而TextView默认无背景: (2)Button的内部文本默认居中对齐,而TextView的 ...
- 安卓java代码标签_Android实现动态添加标签及其点击事件
在做Android开发的时候,会遇到动态添加标签让用户选择的功能,所以自己写了个例子,运行效果图如下. 标签可以左右滑动进行选择,点击的时候,会弹出toast提示选择或者取消选择了哪个标签.通过动态添 ...
- 注册事件的两种方式(传统注册事件、方法监听注册事件)
注册事件的两种方式 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...
- swift3 按钮触发事件_swift5.3 UIView 与 UIButton 点击事件传递参数
UIView 与 UIbutton 点击事件的参数传递:目前我通过 tag 解决了 UIButton 的点击参数传递 设置 UIButton 的 tag,详细见代码let playButton = U ...
- touch事件总结,监听屏幕点击事件
Touch对象--MDN TouchEvent--MDN 一.问题背景 click事件在移动端的300毫秒延迟问题 当需要监听诸如左滑.右滑之类的事件 二.知识点概括 1. 事件类型 touchsta ...
- vue中设置子组件的点击事件不影响父组件的点击事件
" 大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂. " 今天分享个技术块儿. 在做项目的过程中,遇到了个问题,简单的描述一下:有一个card卡片,上面绑定了个点击事件,点击c ...
- php 列表 单击事件,首页gt; PHPgt;如何添加点击事件到jstree的(jQuery插件)异步列表?...
我想将点击事件添加到jstree的异步列表项中. 理想的结果是:当我单击jstree中的项目时,该项目的内容将作为参数传输到sql查询,然后执行该查询并在同一页或另一页中显示结果集. 虽然我不知道如何 ...
- 【Echarts图例点击事件】自定义Echarts图例legend点击事件(已解决)
目录 先睹为快(效果) 1.实现Echarts多条曲线 2.点击echarts触发接口请求 2.1 先默认隐藏部分数据 2.2 自定义legend图例点击事件 3.源码下载地址(解压即用) **[写在 ...
最新文章
- python字典排序取最值总结
- 深度学习核心技术精讲100篇(十四)-一文带你看懂GPflow的前世今生
- php 利用http上传协议(表单提交上传图片 )
- 让用户感到体贴登录页设计灵感
- mysql 5.5.35 单机多实例配置详解_基于mysql-5.5.32的单机多实例多配置文件的
- 工程师,你的钱究竟从哪来?
- python可以给你干什么-你最想用python做什么?python到底能用来做什么?
- 我的前半生之六,创业维艰,我不想骂你,你滚吧
- LA 3713 Astronauts
- Annotation-specified bean name conflicts with existing
- ambari hdfs 启动报错_Ambari 1.6 自动安装hadoop 2.2.0 在Ambari启动namenode时报错
- Java核心技术卷一基础知识第10版demo实例
- 《精通linux设备驱动程序开发》——视频驱动程序
- 【优化】py2下hbase的字符串编码问题(\\xe7\\xbc\\x96)
- Android 开源项目PhotoView遇到问题
- envoy网络安全opa等
- 深度学习:学习路线与规划
- 转载:AMDCPU规格功耗列表-最近要设计低功耗机器,留存参考。
- android 4.4 hifi,海贝(HiBy)R5安卓高解析无损播放器 4.4平衡随身听便携HIFI 双向蓝牙 铝合金黑色...
- Android Weekly #32 - 面对畏惧之人,便说笨方法是行动的勇敢
热门文章
- git之配置在Terminal显示git分支
- redis集群和主从配置
- linux的manual手册不存在,在 Linux 命令行下使用“原力”
- wxpython frame鼠标拖动_Python wxpython模块响应鼠标拖动事件操作示例
- python 文件和目录操作题库
- 第十三天-企业应用架构模式-对象-关系元数据映射模式
- Widows下TortoiseGit登录密码错误
- CommonLibrary——框架通用工具库
- 【李宏毅2020 ML/DL】P34 More about explainable AI | Attribution, Heatmap, explainable model
- 2.JAVA基础——数据类型、变量及运算符