FilterFastClick
首先声明:本库的编写是被QA逼出来的。
在开发过程中经常被QA提一类恶心的bug(快速点击控件出现多个页面或多个弹窗等)
我司QA拿到包之后第一件事就爱测快速点击的场景,他们认为同一个按钮快速点击可能是误操作不应该得到响应。比如某个按钮点击之后应该弹出一个dialog,QA双击控件就出现2个dialog。这原本应该是个正常的场景,但是奈何抵不过他们一直提,所以就做了这个小功能加以限制。
其实这就是个典型的AOP编程了。
屏蔽快速点击最常见的操作是做一个工具类:
public class Utils{
// 检测以避免重复多次点击
private static long lastClickTime;
public static boolean isFastDoubleClick() {
long time = System.currentTimeMillis();
long timeD = time - lastClickTime;
if (0 < timeD && timeD < 500) {
return true;
}
lastClickTime = time;
return false;
}
}
这样就能解决90%问题。
奈何我司QA测得又比较细,某天提了一个更让人心烦的问题:
某个页面上有多个按钮,点击button1的时候紧接着在500毫秒以内又点击了button2,这时候预期应该是button1和button2都应该得到响应。但是因为button1和button2的点击事件都加上了
if(Utils.isFastDoubleClick()){
return;
}
的限制,由于全局都使用的同一个静态lastClickTime变量,就导致这两个控件之间的点击相互屏蔽了。如果是点击button1之后的500毫秒以内点击了button2将会导致button2点击事件中的Utils.isFastDoubleClick()
这句代码为true而走了return。
那么解决的途径只能是不使用全局的lastClickTime这个变量来做上一次点击时间戳的判断,而是对每个控件都单独使用一个变量来记录。
那么最简单的做法就是实现一个自己的OnClickListener类,然后在每个控件设置点击事件的时候都使用这个类来屏蔽快速点击:
<