其实自己也在网上找了一些防抖的方案,比如RxBinding啊,NoDoubleClickListener啊,原始解决方案啊等等,不过那都不是我想要的。
因为项目中使用了ButterKnife绑定控件和为控件注册点击事件。所以上面搜到的那些方案都不太好使,原始的又过于臃肿。
最后还是只能自己动手丰衣足食了。
其实想要防抖无非就是判断一下时间差,但每次写一堆代码,或者说每次复制一堆代码,很臃肿,我是很讨厌这种体验的。

我心中最理想的解决方案是,在每个Click方法第一行加入

    if (ClickUtil.check()) return;

虽然这种也实现了, 但是涉及到静态变量的保存,所有对象都作为静态变量保存到内存中,这样还是不太好的,如果整个项目需要绑定的事件一多到最后肯定效率越来越低。所以综合考虑了一下,最后废弃了这种使用静态方法来检查的思路。

现在的使用方法是,首先声明一个全局的util变量。

    AntiShake util = new AntiShake();

然后在每个Click方法第一行加入

    if (util.check()) return;

就可以实现防抖的目的了。是不是非常方便呢,现在我们来贴一下实现的代码吧。
一共是两个类。
第一个OneClickUtil.java

public class OneClickUtil {private String methodName;public static final int MIN_CLICK_DELAY_TIME = 1000;private long lastClickTime = 0;public OneClickUtil(String methodName) {this.methodName = methodName;}public String getMethodName() {return methodName;}public boolean check() {long currentTime = Calendar.getInstance().getTimeInMillis();if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {lastClickTime = currentTime;return false;} else {return true;}}
}

第二个AntiShake.java

public class AntiShake {private List<OneClickUtil> utils = new ArrayList<>();public boolean check(Object o) {String flag = null;if(o == null)flag = Thread.currentThread().getStackTrace()[2].getMethodName();elseflag = o.toString();for (OneClickUtil util : utils) {if (util.getMethodName().equals(flag)) {return util.check();}}OneClickUtil clickUtil = new OneClickUtil(flag);utils.add(clickUtil);return clickUtil.check();}public boolean check() {return check(null);}
}

代码贴出来了,相信思路也非常容易理解,不过我还是简单讲一下吧。
首先使用OneClickUtil 保存点击事件的lastClickTime。并且实现一个check方法。
然后AntiShake主要是保存这些OneClickUtil对象,并且为他们设置不同的标识,标识为不同的点击事件,同时标识也可以由用户传入,这样可以处理一些特殊情况,后面会讲解。
在AntiShake中,我使用的是 “调用check方法的上级方法名”来做标识,简单的说,我在click方法中调用了这个check方法,我就使用“click”字符串来作为对象标识。

在文章开头的那种使用方法仅适用于每个点击事件对应一个方法的情况,那如果有多个id都被绑在同一个方法上,那么使用同一个方法名作为标识就不太合理了。这种情况的使用方法,应如下:

    @OnClick({R.id.btn1,R.id.btn2,R.id.btn3})public void click(View view) {if(util.check(view.getId())) return;}

也就是手动传入标识,是不是也非常方便呢。同时在xml中为控件配置Onclick对应方法的,也可以使用这种方式来防止重复点击,虽然这种配置Onclick事件的方法已经不推荐使用了,但是在一些比较简单的情况,为了方便,又何尝不可呢。

Android 按键防止过快点击(防抖),在ButterKnife中的简单解决方案。相关推荐

  1. Android按键字符映射文件

    按键字符映射文件(.kcm 文件)负责将 Android 按键代码与修饰符的组合映射到Unicode字符. 如果只是告诉系统该设备仅用于特殊用途(非全键盘),那么对于具有按键的所有内部(内置)输入设备 ...

  2. android 按键用户点击事件,Android按键事件处理过程详解

    Android按键事件处理过程详解 (2013-09-26 14:05:19) 标签: it 在Android系统中,存在多种界面事件,如点击事件.触摸事件.焦点事件和菜单事件等,在这些界面事件发生时 ...

  3. 【android】几种模拟按键、屏幕点击的方法

    模拟按键: 1. new Instrumentation().sendKeyDownUpSync(int keycode); 发送keycode,down,up都会发送一遍 2. new Instru ...

  4. Android:按键响应方式第一种onClick属性,第二种方法接口类,第三种方式匿名内部类,第四种方式Activity

    一.在xml 中设置按键的onClick 绑定的函数 新建一个工程 然后在相关的页面添加一个Button 运行一下 实际上,现在这个按键一,我们去运行的时候,他是没有任何的反馈的,我们按完它,他没有任 ...

  5. Android 按键消息处理 1

    在android系统中,键盘按键事件是由SystemServer服务来管理的:然后在以消息的形式分发给应用程序处理.产生键盘按键事件则是有Linux kernel的相关驱动来实现. 键盘消息有别于其他 ...

  6. android 按键双击,实现Android监控任意控件或按键双击事件方法

    为了实现对Android任意控件和按键进行双击事件的监听,所以写了一个可以在代码中任意移植的解决方法. 一.解决思路 为了实现双击事件的监听,首先需要一个线程来执行两次点击事件的判断,决定是否属于一次 ...

  7. android切换字体颜色,Android开发实现按钮点击切换背景并修改文字颜色的方法

    本文实例讲述了Android开发实现按钮点击切换背景并修改文字颜色的方法.分享给大家供大家参考,具体如下: 其实原理很简单,用到的是selector,用来设置android:background和an ...

  8. Android自定义弹窗模仿微信,Android仿微信右上角点击加号弹出PopupWindow

    本文实例为大家分享了Android仿微信右上角点击加号弹出展示的具体代码,供大家参考,具体内容如下 一.要弹出的布局,随便设计 android:layout_width="match_par ...

  9. android按钮防止重复点击事件,实例详解Android解决按钮重复点击问题

    为了防止用户或者测试MM疯狂的点击某个button,写个方法防止按钮连续点击.具体实例代码如下所示: public class BaseActivity extends Activity { prot ...

最新文章

  1. 在UIWindow上加类似于“回到顶部”的按钮
  2. ble串口程序设计流程图_流程图程序设计的步骤
  3. arm linux 识别新硬盘_Arm发布首款64位实时处理器CortexR82
  4. PsList v1.28使用
  5. python2和3的区别字符编码格式上下文管理is和==的区别
  6. 问题 | fatal: open /dev/null or dup failed: No Such file or directory
  7. Asp.net2.0 学习资源(转载)
  8. [Flags]标识的Enum不能使用Html.GetEnumSelectList方法
  9. Linux LVM管理
  10. 报错Caused by: org.hibernate.AnnotationException: No identifier specified for entity:
  11. java调用js模板引擎_JavaScript模板引擎应用场景及实现原理详解
  12. JQuery操作SharePoint Web Services之添加列表数据
  13. Git 问题:SSL certificate problem: self signed certificate
  14. vfp mysql教程_VFP基础教程 5.5 编辑框控件(editbox)
  15. VS2005+WDK+DriverStudio
  16. 【光电智造】机器人视觉伺服技术
  17. 3D炫酷赛车游戏【附源码】设计实现
  18. win7 64位搭建scrapy
  19. 系统间接口调用/接口对接 Java
  20. 为什么Lisp如此先进,却永远成为不了编程主流语言?深度解析Lisp的优势与劣势

热门文章

  1. win7(xp) APMServ5.2.6 Apache启动失败,MYSQL启动失败 的解决办法
  2. jmeter jp@gc - Ultimate Thread Group-自定义线程
  3. 计算机网络管理员 职业技能鉴定,计算机网络管理员中级职业技能鉴定 文档版...
  4. 苹果手机怎么把照片拼在一起_手机误删照片怎么办?
  5. Excel高亮显示行、列
  6. VS新建项目时出现 异常来自 HRESULT:0x80041FE2
  7. Python文件读写案例——复制大小文件
  8. 《PHP面向对象编程详解》系列技术文章整理收藏
  9. 职场语言的特征3p1A7C指什么,高校邦商务礼仪期末答案
  10. Excel 2013 下拉为“快速分拆”调整为“填充序号”