防止Android过快点击造成多次事件的三种方法
2016-06-08 09:47
741 查看
问题
onClick()事件是Android中常见的回调事件,正常情况下在很短的时间内我们只会点击一次Button,但不排除某些神经质的用户连续疯狂的按,那么问题来了……
举个简单的例子,当我们在订单页面,正常点击后启动支付Activity,但不小心在短时间内多次点击按钮(可能是用户手机比较卡顿),启动了多个结算页面,用户支付完成后又回到订单页面,什么鬼?(我要卸载了)
那么我们可以在点击后执行如下操作:
方法一:
但是如果跳转页面失败呢(这里会涉及到网络请求),又要将按钮设置为true,太麻烦了(一个大型项目有多少个按钮,这得多增加多少行代码,我们的工资又不是按照行来结算的)
方法二:
我们自定义一个NoDoubleClickListener,继承自OnClickListener:
在设置点击事件时用NoDoubleClickListener替换OnClickListener,并且实现方法onNoDoubleClick替换onClick即可:
原理很简单,就不解释了,这其实就是一个简单的回调功能。
方法三:我们优雅一点,使用throttleFirst操作符来解决按钮被多次点击的问题,当然这涉及到RxJava了,这也是大势所趋~~~
![](https://img-blog.csdn.net/20160608102502097)
这里我们使用Jake Wharton大神的 RxBinding库,取1秒内的第一次点击响应。(很简单吧,不明白RxJava的参考我的博客: http://blog.csdn.net/zhyxuexijava/article/details/51597230)
总结:
第二种方法已经优雅了许多,但还是觉得麻烦,RxJava那种简洁的链式调用,配合Retrolambda的使用,越看越舒心。
onClick()事件是Android中常见的回调事件,正常情况下在很短的时间内我们只会点击一次Button,但不排除某些神经质的用户连续疯狂的按,那么问题来了……
举个简单的例子,当我们在订单页面,正常点击后启动支付Activity,但不小心在短时间内多次点击按钮(可能是用户手机比较卡顿),启动了多个结算页面,用户支付完成后又回到订单页面,什么鬼?(我要卸载了)
btnPay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startPay(); } });
那么我们可以在点击后执行如下操作:
方法一:
btnPay.setClickable(false); 或 btnPay.setEnabled(false);
但是如果跳转页面失败呢(这里会涉及到网络请求),又要将按钮设置为true,太麻烦了(一个大型项目有多少个按钮,这得多增加多少行代码,我们的工资又不是按照行来结算的)
方法二:
我们自定义一个NoDoubleClickListener,继承自OnClickListener:
MIN_CLICK_DELAY_TIME) { lastClickTime = currentTime; onNoDoubleClick(v); } } protected abstract void onNoDoubleClick(View v); } " data-snippet-id="ext.060093284d33f1131b2d6acab8dc788f" data-snippet-saved="false" data-codota-status="done">[code]public abstract class NoDoubleClickListener implements View.OnClickListener { public static final int MIN_CLICK_DELAY_TIME = 1000; private long lastClickTime = 0; @Override public void onClick(View v) { long currentTime = Calendar.getInstance().getTimeInMillis(); if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) { lastClickTime = currentTime; onNoDoubleClick(v); } } protected abstract void onNoDoubleClick(View v); }
在设置点击事件时用NoDoubleClickListener替换OnClickListener,并且实现方法onNoDoubleClick替换onClick即可:
btnPay.setOnClickListener(new NoDoubleClickListener() { @Override protected void onNoDoubleClick(View v) { startPay(); } }); }
原理很简单,就不解释了,这其实就是一个简单的回调功能。
方法三:我们优雅一点,使用throttleFirst操作符来解决按钮被多次点击的问题,当然这涉及到RxJava了,这也是大势所趋~~~
() { @Override public void onCompleted() { // } @Override public void onError(Throwable e) { // } @Override public void onNext(Object o) { // } });" data-snippet-id="ext.1a3567d97e49ddd22272ebcb85982740" data-snippet-saved="false" data-codota-status="done">[code] RxView.clicks(btnPay) .throttleFirst(1, TimeUnit.SECONDS) .subscribe(new Observer<Object>() { @Override public void onCompleted() { // } @Override public void onError(Throwable e) { // } @Override public void onNext(Object o) { // } });
这里我们使用Jake Wharton大神的 RxBinding库,取1秒内的第一次点击响应。(很简单吧,不明白RxJava的参考我的博客: http://blog.csdn.net/zhyxuexijava/article/details/51597230)
总结:
第二种方法已经优雅了许多,但还是觉得麻烦,RxJava那种简洁的链式调用,配合Retrolambda的使用,越看越舒心。
相关文章推荐
- 2015最流行的Android组件、工具、框架大全
- android使用隐藏api的方法(使用被@hide的api)
- android之JNI参数传递
- Android开发方式之Java+html+javascript混合开发
- 【Android基础】动画
- Android Framework的启动方法及原理详解
- Android 使用listview实现树形结构
- android中实现透明悬浮的PopupWindow效果
- Android之Adapter的封装与抽象(二)
- Android JNI开发高级篇
- Android 时间为隔天的九点、并且跳过周末
- android studio \65279错误
- This tag and its children can be replaced by one <TextView/> and a compound drawable
- Android中的 Handler
- Android RecyclerView详解及实现瀑布流式布局 推荐
- Android开发书籍推荐 & 学习路线图 & 资料汇整
- android 三种定时器的写法
- Android中的颜色设置
- 今日推荐(三)AndroidResideMenu类似QQ侧滑效果
- 玩转Android之Drawable的使用