按钮防抖(防止重复点击)

写在前面

在日常开发中我们时长会遇到这样的问题,当用户点击某个按钮时触发一个http请求,从后端查询一些数据,或者做一些操作,而当用户无意或有意快速重复的点击按钮时,导致的后果就是重复的http请求或者完全没有重复必要的一些操作,毕竟站在程序的角度来考虑问题,这些操作是消耗cpu时间,消耗内存又完全没有必要的,甚至会造成程序的卡顿,所以我们就需要一种策略去防止这种情况的发生了,并且这个过滤最好是针对按钮进行处理,从根源防止问题的发生。


ok,废话不多说,我的基本思路就是使用一个队列去记录按钮的上次点击时间,当有新的按钮被点击时,判断按钮是否已在队列中,如果不在则移除队头按钮id,在队尾添加新的按钮id,若存在则判断当前点击时间和上次点击时间间隔,判断是否可点击,并且更新点击时间。

核心代码

public boolean checkClick(int clickId) {
        long currentClickTime = System.currentTimeMillis();
        long lastClickTime = 0;
        boolean canClick = false;
        ClickInner remove = null;
        if (!isEmpty()) {
            for (ClickInner c : clickList) {
                if (c.getClickId() == clickId) {
                    lastClickTime = c.getLast();
                    c.setCurrent(currentClickTime);
                    if (c.canClick())
                        canClick = true;
                    remove = c;
                    break;
                }
            }
            ClickInner click = new ClickInner(clickId);
            click.setCurrent(currentClickTime);
            if (remove != null) {
                clickList.remove(remove);
                if (!canClick)
                    click.setLast(lastClickTime);
                push(click);
            } else { //队列中无Element
                if (isFull()) {
                    clickList.get(0).setCurrent(currentClickTime);
                    if (clickList.get(0).canClick())
                        canClick = true;
                    pop();
                    push(click);
                } else {
                    push(click);
                    canClick = true;
                }
            }
        } else { //队空直接push
            ClickInner click = new ClickInner(clickId);
            click.setCurrent(currentClickTime);
            push(click);
            canClick = true;
        }
        return canClick;
    }

使用方法

    public void onBtnNewRegisterClicked() {
        if (!ClickUtils.getInstance().checkClick(R2.id.btn_new_register))
            return;
        //do some thing here...
    }

完整代码链接

ClickUtils : http://pan.baidu.com/s/1eSjFQaY
密码:vp9c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值