关于避免按钮短时间内频繁点击或过快点击的处理方法

开发过程中,遇到了测试提出的bug,原因是做网络请求,生成一条数据的时候,网络响应慢,点击提交按钮没反应,多次点击,导致生成多条数据,数据出现问题。

出现问题,第一反应就是,一旦点击了网络请求按钮,就要设置它为不可点击,等请求回调,无论成功还是失败,再次设置为可点击。

部分代码:

requestNetData();

mBtLoading.setClickable(false);

@Override
public void onError(Call call, Exception e, int id) {
    mBtLoading.setClickable(true);
    Toaster.showToast(GetParkDataActivity.this, "数据保存失败");
    return;
}

@Override
public void onResponse(String response, int id) {
    mBtLoading.setClickable(true);
}

 

但是这样也会存在问题,我们都知道JAVA代码是按顺序执行的,如果当前手机网络不好,这个地方还是会出现多次点击事件,无法禁止快速的重复点击事件,

所以,有必要做一个点击时间间隔处理,和双击返回的原理一样。然后我写了以下代码:

public class ClickUtils {
    private static long lastTime;
    private static long curTime;
    private static Toast mToast;

    public static boolean mClick() {
        if (System.currentTimeMillis() - lastTime >= 5000) {
            curTime = System.currentTimeMillis();
            lastTime = System.currentTimeMillis();
            return true;
        }
        return false;
    }
}

在这里我写了一个点击类,用的时候直接加判断就好了:

    @OnClick(R.id.test)
    public void onClick() {
        if (ClickUtils.mClick()) {
	// 下面是个吐司,我只是抽了一下  第一次点击到5s之后的点击响应这个事件
            ClickUtils.mToaster(this, "111");
        } else {
	// 第一次点击之后 接下来的5s内 走这里
            ClickUtils.mToaster(this, "222");
        }
    }

 

这样可以在业务代码里进行判断了,可以设置是否可点击,多少时间内可点击。

 

技术小白,开发探索中...如有什么不足,还请指正。

 

更新一下现在使用的防止连续点击类 增加RxJava

/**
 * 类目名称 防止点击事件多次点击
 */
public class ClickFilterUtil {
    // 防止连续点击的时间间隔
    private static final long INTERVAL = 1000L;
    // 上一次点击的时间
    private static long lastClickTime;
    private static long lastClickTimeRun;

    public synchronized static boolean filter() {
        long time = System.currentTimeMillis();
        if (time - lastClickTime < INTERVAL) {
            return true;
        }
        lastClickTime = time;
        return false;
    }

    public synchronized static boolean filterRun() {
        long time = System.currentTimeMillis();
        if (time - lastClickTimeRun < INTERVAL) {
            return true;
        }
        lastClickTimeRun = time;
        return false;
    }

    /**
     * 防止重复点击
     *
     * @param target   目标view
     * @param listener 监听器
     */
    @SuppressLint("CheckResult")
    public static void preventRepeatedClick(final View target, long windowDuration, final View.OnClickListener listener) {
        RxView.clicks(target).throttleFirst(windowDuration, TimeUnit.SECONDS).subscribe(new Observer<Object>() {

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }

            @Override
            public void onSubscribe(Disposable d) {
            }

            @Override
            public void onNext(Object object) {
                listener.onClick(target);
            }
        });
    }

    /**
     * 防止重复点击
     *
     * @param target   目标view
     * @param listener 监听器
     */
    @SuppressLint("CheckResult")
    public static void preventRepeatedClick(final View target, final View.OnClickListener listener) {
        preventRepeatedClick(target, 1, listener);
    }
}

更新一些内容

上面的写法都是控制单个的点击,那样全局处理起来就很麻烦,每个点击都要加方法?那不就哭了,后面想到是不是可以从屏幕的触摸角度考虑,然后就有了下面的代码

 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (isPreventFastClick()) {
            if (ev.getAction() == MotionEvent.ACTION_DOWN){
                // 判断连续点击事件时间差
                if (SystemUIUtils.isFastClick()){
                    return true;
                }
            }
        }
        return super.dispatchTouchEvent(ev);
    }
  /**
     * 是否连续点击
     */
    static long lastClickTime = 0;

    public static boolean isFastClick() {
        boolean flag = true;
        long currentClickTime = System.currentTimeMillis();
        if ((currentClickTime - lastClickTime) >= 300) {
            flag = false;
        }
        lastClickTime = currentClickTime;
        return flag;
    }

这里的 300 间隔 是根据使用场景测试总结的,自己可以去权衡一下。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在C语言中实现按键的长按、短按和双击功能可以通过多线程的方式来实现。 首先,我们需要一个全局变量来记录按键的状态,比如键盘按下状态(pressed)和释放状态(released)。然后,我们可以使用一个线程来不断地监测键盘的状态,判断按键的长按、短按和双击。 对于长按功能,我们可以通过判断按键的按下时间是否超过设定的时间来实现。当按键按下时,我们记录下按下的时间,然后在监测线程中判断按键是否已经释放,如果按键释放时间大于设定的时间,则判定为长按。 对于短按功能,我们可以在按键按下时记录下按下的时间,在监测线程中判断按键是否已经释放,如果按键释放时间小于设定的时间,则判定为短按。 对于双击功能,我们可以在监测线程中记录下按键的按下时间和释放时间,如果两次按键的时间间隔小于设定的时间,则判定为双击。 在实现按键功能时,需要注意多线程的同步问题,可以使用锁来确保多个线程对全局变量的操作不会冲突。 以上是一个简单的思路,具体的实现还需要根据具体的应用场景进行调整。同时,还需要考虑到编译器和硬件的差异,以及其他相关的因素,来确保按键功能能够在不同的环境中正常运行。 ### 回答2: 在C语言中,我们可以通过监听键盘的按键事件,来实现检测按键的长按、短按和双击效果。 首先,我们需要定义一些变量来记录按键的状态和时间。我们可以使用一个布尔型变量来表示按键的状态,例如isPressed表示按键是否被按下,以及两个整型变量来记录按键按下和松开的时间。 对于检测长按效果,我们可以在每次按键被按下时记录当前的系统时间,并通过不断监听键盘事件来检测按键是否持续按下。如果按键一直被按下,并且按键按下的时间超过一定的阈值(可以自行设定),就可以判断为长按。 对于检测短按效果,我们可以判断按键是否在很短的时间内被按下并松开,例如在100毫秒内,即可判断为短按。 对于检测双击效果,我们可以通过记录按键按下的次数来实现。每次按键按下时,我们可以检测两次按键的时间间隔是否在一定的范围内(比如200毫秒内),如果是,则可以判断为双击效果。 总之,通过监听键盘事件,并结合一些时间和状态的记录,我们可以在C语言中实现按键的长按、短按和双击效果。 ### 回答3: C语言中,我们可以利用计时器和状态机来检测按键的长按、短按和双击操作。 首先,我们需要定义一个变量作为计时器,用来记录按键被按下的时间。我们假设按下按键时,将这个变量初始化为0。 当按键被按下后,我们可以在主循环中进行延时操作,然后检测按键是否仍然被按下,如果仍然被按下,就将计时器加1。 接着,我们可以设置一个阈值,用来判断按键按下的时间是短按还是长按。如果计时器记录的时间小于阈值,就可以判定为短按;如果计时器记录的时间大于等于阈值,就可以判定为长按。 同时,我们还需要维护一个状态机来记录双击操作。当按键短按时,状态机将记录这一次短按操作,并等待一定的时间,如果这段时间内再次检测到按键短按,就可以判定为双击操作。 综上所述,通过利用计时器和状态机,我们可以在C语言中实现按键的长按、短按和双击功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值