App中,有很大一部分場景是點擊按鈕,向服務端提交數據,由於網絡請求需要時間,用戶很可能會多次點擊,造成數據重複提交,造成各種莫名其妙的問題。因此,防止按鈕多次點擊,是Android開發中一個很重要的技術手段。
下面介紹兩種解決方式:
1.每個按鈕點擊事件中,記錄點擊時間,判斷是否超過點擊時間間隔
private long mLastClickTime = 0;
public static final long TIME_INTERVAL = 1000L;
private Button btTest;
private void initView() {
btTest = findViewById(R.id.bt_test);
btTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
long nowTime = System.currentTimeMillis();
if (nowTime - mLastClickTime > TIME_INTERVAL) {
// do something
mLastClickTime = nowTime;
} else {
Toast.makeText(MainActivity.this, "不要重複點擊", Toast.LENGTH_SHORT).show();
}
}
});
}
這種方式,每個點擊事件都需要寫一個時間判斷,重複代碼很多。
2.封裝一個點擊事件,處理點擊間隔判斷
public abstract class CustomClickListener implements View.OnClickListener {
private long mLastClickTime;
private long timeInterval = 1000L;
public CustomClickListener() {
}
public CustomClickListener(long interval) {
this.timeInterval = interval;
}
@Override
public void onClick(View v) {
long nowTime = System.currentTimeMillis();
if (nowTime - mLastClickTime > timeInterval) {
// 單次點擊事件
onSingleClick();
mLastClickTime = nowTime;
} else {
// 快速點擊事件
onFastClick();
}
}
protected abstract void onSingleClick();
protected abstract void onFastClick();
}
使用:
btTest.setOnClickListener(new CustomClickListener() {
@Override
protected void onSingleClick() {
Log.d("xxx", "onSingleClick");
}
@Override
protected void onFastClick() {
Log.d("xxx", "onFastClick");
}
});
相比於第一種方式,這種方法將重複點擊的判斷封裝在CustomClickListener內部,外部無需處理時間判斷,只需要實現點擊方法即可。