概述
在日常开发工作中,会碰到Button按钮点击处理用户的需求,比方提交一个订单到服务器或跳转进行付出按钮操作,假如呈现延迟情况形成界面短时刻没呼应,用户接下来就很有可能再去点击一次按钮去提交,这样就的话会形成上一个事情还未处理完又多了一个新的事情需求处理,就会呈现提交两次订单到后台服务器或付出两次。为了防止用户抖动多次点击形成的问题,就要从点击事情自身去寻觅处理办法。
事情剖析
为了防止例如用户对按钮多次点击,形成多次网络恳求的现象。咱们需求对按钮做防抖处理,即在指定时刻内只呼应一次点击事情。例如在短信验证登录时,多次点击就会发送多条短信,很影响体验,并且容易填错验证码。
这儿挑选运用的是RxBinding库,更简洁更容易理解,更适合我这样的新手。
首要咱们需求导入依赖:
compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
activity中的完成代码:
RxView.clicks(button1)
.throttleFirst(3000,TimeUnit.MILLISECONDS)
subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Log.i("RxView","点击了button1");
}
});
xml中的代码只有一个Button控件:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1"
android:id="@+id/button1"/>
可以看到,无论咱们怎么点击,都只会呼应3秒内的第一次点击事情。
这儿只展现了单个按钮,也可运用ButterKnife完成多个按钮防抖,相对简单这儿就不展现了。
RXBinding防抖案件剖析
一个普通的按钮点击后跳转到另一个页面的代码片段,如下:
//按钮点击事情:Button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //比方 跳转到另一个Activity } });
剖析:
正常情况下会跳转到另一页面,假如碰到手机比较卡的情况,或者用户手抖瞬间点击两次,就会形成点击事情被调用两次,页面跳转了2次。作为程序员首要会想到的便是在点击之后把Button设置为不行点击或不行用 :“clickable=false | | Enable=false”;但是,相似这样的button一个项目不知道有多少个,每个都要进行判别是否是Button是否可用,就会比较费事、代码也显得冗余。有么有更好滴处理办法呢?
处理方案一
利用规则呼应时刻,限制接连点击事情重复。
private long lastClickTime = 0;//1、前次点击的时刻 @Override public void onClick(View v) { //2、判别间隔前次点击小于2秒 if (System.currentTimeMillis() - lastClickTime <= 2000) { //3、记载这次点击时刻 lastClickTime = System.currentTimeMillis(); } }}其实这个处理方案便是判别了一下时刻差,容易理解。但问题是,每次都要写(仿制)一堆代码,显得代码冗余,重用性不高,假如可以封装成东西类的方法,在每次点击事情发生之前调用一下就可以自行内部判别,这样就更好了嘛!
方案二
随着Rxjava事情流处理、呼应式开发的观察者形式兴起,那么对于Android控件事情监听也有了变化,通过 RxBinding 把点击的事情监听转换成 Observable 之后,就有了对它进行扩展的可能。
RxBinding的运用事例详解博文
RxBinding的运用和源码解析博文
这样可以运用RxBinding完成Button防抖问题处理。代码如下:(前后表明1.0\2.0版别用法有别)
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();
}
}) ;
RxView.clicks(button)
.throttleFirst( 2 , TimeUnit.SECONDS ) //两秒钟之内只取一个点击事情,防抖操作
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
}
});
以上是对Android开发中的RXBinding防抖学习,以及实战的方案剖析与处理。更多Android进阶技能前往传送直达↓↓↓ :www.6hu.cc/go//?target=htt…点击直达参阅学习更多的Android核心技能。
总结一下
- 呼应式:便是有人建议,就有人呼应,例如播送,发送恳求后,播送拦截恳求后就会做出相应。
- 事情流:一环一环先后顺序发生的事情。
- Rxjava的优点:使代码完成的结构看起来更清晰有条理章法。
- 观察者形式:便是教室里,教师是被观察者,学生便是观察者。教师说举手,学生遭到指令就会做出呼应。