问题

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() {                    @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的使用,越看越舒心。

更多相关文章

  1. 【Android】解决使用Dialog + EdiText 实现评论功能时,软键盘不协
  2. Android开发技巧:给Button的点击上色
  3. 教你如何使用android studio发布release 版本(完整版)
  4. Android界面UI开发中按钮Button的使用
  5. Android(安卓)Studio 使用USB真机调试教程
  6. Android(安卓)实现按钮 跳转到某网页
  7. [Android(安卓)Studio]掌握Android(安卓)Studio的五种常见控件和
  8. Android:dkplayer非全屏时候显示返回按钮
  9. iOS中的抽屉菜单

随机推荐

  1. android退出应用程序
  2. Android 如何获取摄像头所支持的所有分辨
  3. PopupWindow设置点击外部取消显示后无效
  4. Android电池电量更新 - BatteryService(转
  5. android执行Linux命令
  6. Android SharedPreferences数据存储
  7. 浅谈Android Architecture Components
  8. pinyin4j在Android中的使用
  9. Android 4.0源码编译错误
  10. Android 获取通话记录