分享

防止Android过快点击造成多次事件的三种方法

 逍遥的砖头 2024-04-30 发布于天津

问题

onClick()事件是Android中常见的回调事件,正常情况下在很短的时间内我们只会点击一次Button,但不排除某些神经质的用户连续疯狂的按,那么问题来了……

举个简单的例子,当我们在订单页面,正常点击后启动支付Activity,但不小心在短时间内多次点击按钮(可能是用户手机比较卡顿),启动了多个结算页面,用户支付完成后又回到订单页面,什么鬼?(我要卸载了)

   btnPay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startPay();
            }
        });

那么我们可以在点击后执行如下操作:

方法一:

  btnPay.setClickable(false);
  或
  btnPay.setEnabled(false);

但是如果跳转页面失败呢(这里会涉及到网络请求),又要将按钮设置为true,太麻烦了(一个大型项目有多少个按钮,这得多增加多少行代码,我们的工资又不是按照行来结算的)

方法二:

我们自定义一个NoDoubleClickListener,继承自OnClickListener:

public abstract class NoDoubleClickListener implements View.OnClickListener {
    public static final int MIN_CLICK_DELAY_TIME = 1000;
    private long lastClickTime = 0;

    @Override
    public void onClick(View v) {
        long currentTime = Calendar.getInstance().getTimeInMillis();
        if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {
            lastClickTime = currentTime;
            onNoDoubleClick(v);
        }
    }

    protected abstract void onNoDoubleClick(View v);

}

在设置点击事件时用NoDoubleClickListener替换OnClickListener,并且实现方法onNoDoubleClick替换onClick即可:

  btnPay.setOnClickListener(new NoDoubleClickListener() {
          @Override
          protected void onNoDoubleClick(View v) {
              startPay();
          }
      });

    }

原理很简单,就不解释了,这其实就是一个简单的回调功能。

方法三:我们优雅一点,使用throttleFirst操作符来解决按钮被多次点击的问题,当然这涉及到RxJava了,这也是大势所趋~~~

这里写图片描述

 RxView.clicks(btnPay)
                .throttleFirst(1, TimeUnit.SECONDS)
                .subscribe(new Observer<Object>() {
                    @Override
                    public void onCompleted() {
                       //
                    }

                    @Override
                    public void onError(Throwable e) {
                        //
                    }

                    @Override
                    public void onNext(Object o) {
                        //
                    }
                });

这里我们使用Jake Wharton大神的 RxBinding库,取1秒内的第一次点击响应。(很简单吧,不明白RxJava的参考我的博客: http://blog.csdn.net/zhyxuexijava/article/details/51597230

总结:

第二种方法已经优雅了许多,但还是觉得麻烦,RxJava那种简洁的链式调用,配合Retrolambda的使用,越看越舒心。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多