Android的按钮或某些组件在接受用户点击时候,会触发提交或响应用户事件,比如提交一次数据到网络服务器,假设用户点击速度太快,以至于这两次点击事件相差无几,会造成接下来的业务逻辑处理异常,因此需要对用户快速点击事件做一层拦截,我实现了一个安全的拦截用户快速点击事件类:
package zhangphil.app;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
public abstract class SafeClickListener implements View.OnClickListener {
private final int WHAT = 0xa01;
private boolean canClick = true;
private int GAP = 3000;//相隔3秒的点击才有效。
private Handler handler = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
canClick = true;
}
};
@Override
public final void onClick(View view) {
delay();
if (!canClick) {
Log.d("拦截点击", "无效点击,点击太快了");
return;
}
canClick = false;
onSaveClick(view);
}
public abstract void onSaveClick(View view);
private void delay() {
handler.removeMessages(WHAT);
Message msg = handler.obtainMessage();
msg.what = WHAT;
handler.sendMessageDelayed(msg, GAP);
}
}
这个类在处理用户点击事件时候,只有大于3秒间隔的点击事件才会认为是有效点击,两次点击事件小于3秒则认为是无效的连续快速点击,被认为是无效点击事件。
使用方式,例如给一个Button添加点击事件响应回调onSaveClick():
package zhangphil.app;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=findViewById(R.id.button);
button.setOnClickListener(new SafeClickListener() {
@Override
public void onSaveClick(View view) {
Log.d("点击","有效");
}
});
}
}