Android防止用戶快速點擊觸發

Android的按鈕或某些組件在接受用戶點擊時候,會觸發提交或響應用戶事件,好比提交一次數據到網絡服務器,假設用戶點擊速度太快,以致於這兩次點擊事件相差無幾,會形成接下來的業務邏輯處理異常,所以須要對用戶快速點擊事件作一層攔截,我實現了一個安全的攔截用戶快速點擊事件類:java

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秒則認爲是無效的連續快速點擊,被認爲是無效點擊事件。android

使用方式,例如給一個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("點擊","有效");
            }
        });
    }
}
相關文章
相關標籤/搜索