APP端发起一个请求,有时用户手抖点击了两下会响应两次点击事件照成发起了两次请求。
这时你可能要后端接口做防重复处理,像提现、充值这种与金钱有关的接口标准的服务器是做了的。但新项目新人很可能没考虑到这个问题。所以像这种问题最好的处理方案是前端和后端同时做处理做双重保证。Android前端要做的就是防止短时间请求两次,即防止手抖或用户故意快速多点导致发起多次请求。
防止此问题的出现有三种实现方式。
1、用一个Boolean值做判断如果执行了请求,要等本次请求完成后再响应下一次。这个方法不能绝对保证,有时还是会在短时内(约20ms)响应了两次请求
2、使用RXView这是目前比较流行的方法,可靠性高,但使用麻烦。
使用方法如下:
RxView.clicks(button)
.throttleFirst(2, TimeUnit.SECONDS) // 2s内第1次点击按钮的事件
.subscribe(new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object value) {
Log.d(TAG, "发送了网络请求" );
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "对Error事件作出响应" + e.toString());
}
@Override
public void onComplete() {
Log.d(TAG, "对Complete事件作出响应");
}
});
3、自定义一个ClickButton继续Button, 重写onTouch事件。可靠性高,使用简单。
和普通Button使用一样,把你要防止重复点击的Button换成此ClickButton即可
实现原理很简单,响应第一次点击事件后,在规定时间内不再给响应。
ClickButton.java
/**
* 防止重复点击Button
*/
public class ClickButton extends android.support.v7.widget.AppCompatButton {
private boolean mEnable = true;
//此时间内只响应一次点击事件
final int During = 1000;
public ClickButton(Context context) {
super(context);
}
public ClickButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP){
if (mEnable){
mEnable = false;
postDelayed(new Runnable() {
@Override
public void run() {
mEnable = true;
}
}, During);
}
else{
return true;
}
}
return super.onTouchEvent(event);
}
}
网友评论