问题

onClick事件是Android开发中最常见的事件。

比方,一个submitButton。功能是点击之后会提交一个订单,

则一般代码例如以下,当中submitOrder()函数会跳转到下一页进行处理

    //代码0
submitButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
submitOrder();
}
});

正常情况下这段代码是没什么问题的,可是Android设备的机型性能等千差万别,假设碰到比較卡的手机。则有可能出现submitOrder()函数跳转页面出现延迟的现象。碰到这样的现象,则用户就非常有可能再次点击一次,从而造成函数被调用两次。出现反复订单的BUG。

一般地,碰到这现象,首先就会想到的就是在点击之后把submitButton设置为不可点击:

     //代码1
submitButton.setClickable(false);
//或者
submitButton.setEnabled(false); </code>

此方法也确实有效,只是假设submitOrder()方法没有成功,须要再次提交订单时又须要再反复把submitButton设置为可点击状态。假设类似的button比較多时,就显得比較麻烦、混乱。

方案

自己定义一个NoDoubleClickListener,继承自OnClickListener
    //代码2
public abstract class NoDoubleClickListener implements 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);
}
}
}

用法—— 给submitButton设置点击事件时用NoDoubleClickListener取代OnClickListener。而且实现方法onNoDoubleClick取代onClick就可以,像这样:


<span style="font-size:14px;">      //代码3
submitButton.setOnClickListener(new NoDoubleClickListener() {
@Override
public void onNoDoubleClick(View v) {
submitOrder();
}
}); </span>

原理

非常easy,见代码……

就是用onNoDoubleClick取代onClick处理详细的操作,在onClick方法中加一个推断:在接收到点击事件之后,先推断一下时间,假设距离上次处理操作不足MIN_CLICK_DELAY_TIME,就忽视——即能防止误操作的连续点击导致反复事件。

MIN_CLICK_DELAY_TIME可调。

优势

优点是不用改变原有代码的逻辑,就仅仅须要两个替换:NoDoubleClickListener取代OnClickListener,onNoDoubleClick取代onClick。
代码的结构等都不须要做改变(**对照上面的代码0跟代码**3),不须要关心处理更改button的状态这些额外推断逻辑,仅仅须要关注业务逻辑就可以,简洁优雅~

Android防止过快点击造成多次事件的更多相关文章

  1. Android:防止过快点击造成多次事件 问题

    自定义一个NoDoubleClickListener,继承自OnClickListener: public abstract class NoDoubleClickListener implement ...

  2. android自定义dialog中点击listview的item事件关闭dialog

    import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; ...

  3. Android中Listview点击item不变颜色以及设置listselector 无效

    Android中Listview点击item不变颜色以及设置listselector 无效 这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listsele ...

  4. android通知栏Notification点击,取消,清除响应事件

    主要是检测android通知栏的三种状态的响应事件 这次在实现推送需求的时候,要用到android通知栏Notification点击后进入消息页面,因为要实现一个保存推送用户名字的功能,我在点击后处理 ...

  5. android中ListView点击和里边按钮点击不能同时生效问题解决

    今天遇到一个问题:android中ListView点击和里边button点击不能同时生效问题解决. 原因是: listView 在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得 ...

  6. 基于Android的模拟点击探索

    前言 压力测试中,一般会用到自动化测试.准备写一个APP,可以记录屏幕上的点击事件,然后通过shell命令来模拟自动执行.shell指令,比较容易实现.那么,关键的一步是获取点击的坐标.对于Andro ...

  7. python模拟android屏幕高频点击工具

    一.环境 windows 10  + python3.6 二.需求 1.模拟android设备高频点击事件: 2.模拟规定次数的点击事件或模拟规定时间内的点击事件: 三.code 1.模拟规定时间内的 ...

  8. Android控件点击事件

    1. 介绍 本文介绍了Android控件的点击事件 Android控件点击(onClick)事件可以用如下三种方式来实现 2. 实现onClick方法 在layout的xml中指定onClick方法, ...

  9. android: Android水波纹点击效果

    Android API 21及以上新增了ripple标签用来实现水波纹的效果.我们可以通过设置ripple背景来实现一些View点击效果. 该水波纹效果有两种:一种是有界的(点击后类似于一个矩形向四周 ...

随机推荐

  1. div两侧的boder断开 消失 奇怪

    原文发布时间为:2009-11-06 -- 来源于本人的百度文章 [由搬家工具导入] 解决方法: 设定外层DIV的宽度即可,如 width:99% ========================== ...

  2. Controller方法返回值

    1. 返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view. //入门程序 第一 包类 + 类包 + 方法名 @Re ...

  3. java中Map的entrySet 和keySet的使用

    存储这样的一个数据关系结构  使用嵌套map存储 可以通过调用  entrySet方法  或者 keySet方法 进行迭代或者增强for循环 便利输出 这里演示 迭代器的方式进行遍历 package ...

  4. SQL SERVER 查询一个表有多少列

    ) from syscolumns where id = object_id('tbname') 或者 select * from syscolumns where id = object_id('t ...

  5. C#根据经纬度获取物理地址

    废话不多说,直接上代码: 1.首先新建几个类,定义一些属性: public class BaiDuGeoCoding { public int Status { get; set; } public ...

  6. bzoj1455&&luogu2713罗马游戏

    罗马游戏 题目描述 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻. ...

  7. 洛谷——1508 Likecloud-吃、吃、吃

    题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏 ...

  8. usaco-Subset Sums

    题意: 给出一个1-n的数列,求把它分为两组数使得两组数的和相等的方案数. 分析: 如果可能分成两组,那么(n+1)n/2一定为偶数,且n%4=2或3.可以设dp[i][j]表示从1-i中的数拼出的方 ...

  9. ELK之filebeat替代logstash收集日志

    filebeat->redis->logstash->elasticsearch 官网下载地址:https://www.elastic.co/downloads/beats/file ...

  10. 最新Webstrom, Idea 2019.1.3 的激活

    1.注册码激活 打开网址(IntelliJ IDEA 注册码),我们能看到下面的界面,直接点击获取激活码,将生成的激活码粘贴到WebStorm激活对话框中的Lisence Code输入框,点击OK即可 ...