Android防止用户快速点击触发

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("点击","有效");
            }
        });
    }
}

 

你可能感兴趣的:(android)