Android之Button控件多次点击问题及RxBinding事件流

来源:互联网 发布:十本刀 知乎 编辑:程序博客网 时间:2024/06/02 06:34

前言:在日常开发工作中经常会用到Button按钮点击处理用户的需求,比如提交一个订单到服务器或跳转进行支付按钮操作,如果出现延迟情况造成界面短时间没响应,用户接下来就很有可能再去点击一次按钮去提交,这样就的话会造成上一个事件还未处理完又多了一个新的事件需要处理,就会出现提交两次订单到后台服务器或支付两次,看似小问题,但是诸如此类的问题会成为不容小觑的Bug。而作为优秀专业的程序员是应该有洁癖的,那就是见到Bug就像小女生见到蟑螂一样,所以一定要消灭每一个Bug,不可能想和BUG相伴工作。闲话少说,我们进入正题。


一、举一个提交订单的例子,代码简约如下。

//按钮点击事件:submitButton.setOnClickListener(new  OnClickListener() {       @Override       public void onClick(View v) {          submitOrder();       } }); 

分析:正常情况下这段代码应该是没什么问题的,但是Android设备的机型性能等千差万别,如果碰到比较卡的手机,则有可能

出现submitOrder()函数跳转页面出现延迟的现象。碰到这种现象,则用户就很有可能再次点击一次,从而造成函数被调用两次,出现重复订单的BUG。

所以首先就会想到的就是在点击之后把Button设置为不可点击或不可用  :“clickable=false  | |  Enable=false”;

但是,类似的button比较多时,就显得比较麻烦、混乱,不推荐使用,初级程序员可以尝试一下。


二、利用规定时间内响应方案,可以防止快速连续点击事件重复。

 private long lastClickTime = 0;//上次点击的时间        @Override        public void onClick(View v) {            if (System.currentTimeMillis() - lastClickTime <= 2000) {//判断距离上次点击小于2秒                lastClickTime = System.currentTimeMillis();//记录这次点击时间                            }        }

三、RxBinding事件流

随着Rxjava事件流处理、响应式开发的观察者模式兴起,那么对于Android控件事件监听也有了变化,通过 RxBinding 把点击的事件监听转换成 Observable 之后,就有了对它进行扩展的可能。RxBinding的使用案例详解博文

所以,可以使用RxBinding实现Button防抖操作:

 button = (Button) findViewById( R.id.bt ) ;     RxView.clicks( button )             .throttleFirst( 2 , TimeUnit.SECONDS )   //两秒钟之内只取一个点击事件,防抖操作             .subscribe(new Action1<Void>() {                 @Override                 public void call(Void aVoid) {                     Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();                 }     }) ;

彩蛋:  结尾把一些含糊的概念送给大家

响应式:就是有人发起,就有人响应,例如广播,发送请求后,广播拦截请求后就会做出相应。
事件流:一环一环先后顺序发生的事件。
Rxjava的优点:使代码实现的结构看起来更清晰有条理章法。
观察者模式:就是教室里,老师是被观察者,学生就是观察者。老师说举手,学生受到指令就会做出响应。