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