开发中遇到过测试的暴力点击测试,短时间内连点按钮会引起一些问题,例如打开了两次相同的页面,回退时需要关闭两次才能回到触发页面,比如点击支付时发起了两次支付等。
解决办法
1.用工具类来实现
在需要拦截短时间内二次点击的按钮中使用建立的工具类来拦截,两次点击的间隔阈值可以配置。
2.重写View.OnclickListener
新建类继承View.OnclickListener,重写onClick方法来拦截短时间的内的点击,两次点击的间隔阈值可以配置,在需要拦截短时间内二次点击的地方使用。
以上两种方法对项目代码的改动量是比较大的,如果是一个已经完成的项目想要改动点击事件,需要花费比较大的时间与精力。
我在之前的项目中使用的是第三方库,github.com/liys666666/… 库,该库有3个版本,该库第一二个版本本质是通过查找每个activity中的view,并通过反射来修改view的onClickListener实现的,仅需在application中统一配置即可,比较方便。
3.通过Aop的思想来实现短时间内二次点击的拦截
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
前面提到的DoubleClick库的第三个版本使用的即是aop的一种Android解决方案, 使用的是github.com/HujiangTech… 。
但是我在引入DoubleClick库的第三个版本的时候与我当时的项目有冲突,无法编译通过。 于是我在网上查询了Android 端的其他aop解决方案,找到了ASM。
ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。
学习ASM或者解决Aspectjx与项目的冲突,对于当时的项目进度来说不太可能的,于是我当下选择的是使用DoubleClick的2.0版本来实现短时间二次点击的拦截。但是我了解到Android 12 就有可能会把View的onClickListener反射禁止,所以以后通过Aop的方式无疑是更正确的处理方式,之后有时间会尝试去使用ASM或者Aspectjx。