前言
最近好多用户吐槽我们公司app列表滑动不跟手(就是滑动的时候手指触摸屏幕滑动停不下来),初步推测是封装的RecycleView有问题,于是进行了一系列“诊断”,此过程中把封装的RecycleView又重构有扩展完善的不能再完善了,开始怀疑人生了问题依然没找到。接近奔溃正准备放弃的时候,我在BaseActivity中发现了一段代码
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// 判断连续点击事件时间差
if (ActivityUtil.isFastClick()) {
return true;
}
}
return super.dispatchTouchEvent(event);
}
ActivityUtil:
/********防止按钮连续点击********/
private static long lastClickTime;
public synchronized static boolean isFastClick() {
long time = System.currentTimeMillis();
if (time - lastClickTime < 500) {
return true;
}
lastClickTime = time;
return false;
}
看到这段代码我估计大家都明白,你想的没错就是防止按钮重复点击。请收回你的大笑,这个坑我跳进去快一周了,终于找到根源了,当时看到这段代码我心里一顿草泥马,毕竟接手该项目已经超过2个月,写这段代码的大神早就不承认了。
问题分析
原因很简单就是fragment都是依附Activity ,每个Activity都继承了这个BaseActivity,在BaseActivity 的dispatchTouchEvent中根据时间差做了事件的拦截,导致列表滑动不跟手指。这里有一个知识点或者说面试经常会问的知识
解决思路
到底Android按钮多次点击该怎么解决呢,同学们看到这里估计早就开骂了,上边这么多废话。不要着急哥就是这么个人。网上所有的解决方案很多核心原理就那么一个:
通过每个按钮点击事件中,记录点击时间,判断是否超过点击时间间隔,
最终解决方案
使用AOP来解决重复点击,android studio编译报错解决方案
如果你在使用AOP方式解决问的时候遇到了其他问题那就用这个Github
使用方式:要么自己引入第三方的库,要么自己对照库自己写一套,不要傻乎乎的引入了第三方库又自己写了一套,如果你中招了可别说是认识我