Android:防止過快點擊造成多次事件


Android:防止過快點擊造成多次事件

問題

onClick事件是Android開發中最常見的事件。比如,一個submitButton,功能是點擊之后會提交一個訂單,
則一般代碼如下,其中submitOrder()函數會跳轉到下一頁進行處理 :

        //代碼0
submitButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
submitOrder();
}
});

正常情況下這段代碼是沒什么問題的,但是Android設備的機型性能等千差萬別,如果碰到比較卡的手機,則有可能出現submitOrder()函數跳轉頁面出現延遲的現象。碰到這種現象,則用戶就很有可能再次點擊一次,從而造成函數被調用兩次,出現重復訂單的BUG。
一般地,碰到這現象,首先就會想到的就是在點擊之后把submitButton設置為不可點擊:

        //代碼1
submitButton.setClickable(false);
//或者
submitButton.setEnabled(false);

此方法也確實有效,不過如果submitOrder()方法沒有成功,需要再次提交訂單時又需要再重復把submitButton設置為可點擊狀態。如果類似的button比較多時,就顯得比較麻煩、混亂。

方案


————-So,接下來就是咱的顯得比較優雅的方法啦,~(@^_^@)~ ———————


自定義一個NoDoubleClickListener,繼承自OnClickListener

        //代碼2
public abstract class NoDoubleClickListener implements OnClickListener {

public static final int MIN_CLICK_DELAY_TIME = 1000;
private long lastClickTime = 0;

@Override
public void onClick(View v) {
long currentTime = Calendar.getInstance().getTimeInMillis();
if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {
lastClickTime = currentTime;
onNoDoubleClick(v);
}
}
}

使用方法—— 給submitButton設置點擊事件時用NoDoubleClickListener代替OnClickListener,並且實現方法onNoDoubleClick代替onClick即可,像這樣:

        //代碼3
submitButton.setOnClickListener(new NoDoubleClickListener() {
@Override
public void onNoDoubleClick(View v) {
submitOrder();
}
});

原理:

很簡單,見代碼……
就是用onNoDoubleClick代替onClick處理具體的操作,在onClick方法中加一個判斷:在接收到點擊事件之后,先判斷一下時間,如果距離上次處理操作不足MIN_CLICK_DELAY_TIME,就忽視——即能防止誤操作的連續點擊導致重復事件。

MIN_CLICK_DELAY_TIME可調。

優勢

好處是不用改變原有代碼的邏輯,就只需要兩個替換:NoDoubleClickListener代替OnClickListener,onNoDoubleClick代替onClick。 代碼的結構等都不需要做改變(**對比上面的代碼0跟代碼**3),不需要關心處理更改button的狀態這些額外判斷邏輯,只需要關注業務邏輯即可,簡潔優雅~



本文同步在我的獨立博客上發布:http://www.barryzhang.com/archives/410


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com