版本与bug知识小点架构

Android 快速多次点击解决方案

2019-07-18  本文已影响292人  一个不掉头发的开发

前言

最近好多用户吐槽我们公司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事件分发机制

解决思路

到底Android按钮多次点击该怎么解决呢,同学们看到这里估计早就开骂了,上边这么多废话。不要着急哥就是这么个人。网上所有的解决方案很多核心原理就那么一个:

通过每个按钮点击事件中,记录点击时间,判断是否超过点击时间间隔,

最终解决方案

Android优雅地处理按钮重复点击

使用AOP来解决重复点击,android studio编译报错解决方案

如果你在使用AOP方式解决问的时候遇到了其他问题那就用这个Github

使用方式:要么自己引入第三方的库,要么自己对照库自己写一套,不要傻乎乎的引入了第三方库又自己写了一套,如果你中招了可别说是认识我

上一篇下一篇

猜你喜欢

热点阅读