onClick事件是Android開發(fā)中最常見的事件,正常情況下這段代碼是沒什么問題的,
但是Android設(shè)備的機(jī)型性能等千差萬別,如果碰到比較卡的手機(jī),
則有可能出現(xiàn)submitOrder()函數(shù)跳轉(zhuǎn)頁面出現(xiàn)延遲的現(xiàn)象。碰到這種現(xiàn)象,則用戶就很有可能再次點(diǎn)擊一次,
從而造成函數(shù)被調(diào)用兩次,出現(xiàn)重復(fù)訂單的BUG。
解決方法
方案一:(不建議)
一般地,碰到這現(xiàn)象,首先就會想到的就是在點(diǎn)擊之后把submitButton設(shè)置為不可點(diǎn)擊:
此方法也確實有效,不過如果submitOrder()方法沒有成功,需要再次提交訂單時又需要再重復(fù)把submitButton設(shè)置為可點(diǎn)擊狀態(tài)。
如果類似的button比較多時,就顯得比較麻煩、混亂。
方案二
自定義一個NoDoubleClickListener,繼承自O(shè)nClickListener:
給submitButton設(shè)置點(diǎn)擊事件時用NoDoubleClickListener代替OnClickListener,并且實現(xiàn)方法onNoDoubleClick代替onClick即可,像這樣:
原理:
很簡單,見代碼……
就是用onNoDoubleClick代替onClick處理具體的操作,在onClick方法中加一個判斷:在接收到點(diǎn)擊事件之后,
先判斷一下時間,如果距離上次處理操作不足MIN_CLICK_DELAY_TIME,就忽視——即能防止誤操作的連續(xù)點(diǎn)擊導(dǎo)致重復(fù)事件。
MIN_CLICK_DELAY_TIME可調(diào)。
優(yōu)勢
好處是不用改變原有代碼的邏輯,就只需要兩個替換:NoDoubleClickListener代替OnClickListener,
onNoDoubleClick代替onClick。 代碼的結(jié)構(gòu)等都不需要做改變(**對比上面的代碼0跟代碼**3),
不需要關(guān)心處理更改button的狀態(tài)這些額外判斷邏輯,只需要關(guān)注業(yè)務(wù)邏輯即可,簡潔優(yōu)雅~
但是Android設(shè)備的機(jī)型性能等千差萬別,如果碰到比較卡的手機(jī),
則有可能出現(xiàn)submitOrder()函數(shù)跳轉(zhuǎn)頁面出現(xiàn)延遲的現(xiàn)象。碰到這種現(xiàn)象,則用戶就很有可能再次點(diǎn)擊一次,
從而造成函數(shù)被調(diào)用兩次,出現(xiàn)重復(fù)訂單的BUG。
解決方法
方案一:(不建議)
一般地,碰到這現(xiàn)象,首先就會想到的就是在點(diǎn)擊之后把submitButton設(shè)置為不可點(diǎn)擊:
此方法也確實有效,不過如果submitOrder()方法沒有成功,需要再次提交訂單時又需要再重復(fù)把submitButton設(shè)置為可點(diǎn)擊狀態(tài)。
如果類似的button比較多時,就顯得比較麻煩、混亂。
方案二
自定義一個NoDoubleClickListener,繼承自O(shè)nClickListener:
public abstract class NoDoubleClickListener implements OnClickListener { public static final int MIN_CLICK_DELAY_TIME = 1000;//這里設(shè)置不能超過多長時間 private long lastClickTime = 0; protected abstract void onNoDoubleClick(View v); @Override public void onClick(View v) { long currentTime = Calendar.getInstance().getTimeInMillis(); if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) { lastClickTime = currentTime; onNoDoubleClick(v); } } }
給submitButton設(shè)置點(diǎn)擊事件時用NoDoubleClickListener代替OnClickListener,并且實現(xiàn)方法onNoDoubleClick代替onClick即可,像這樣:
submitButton.setOnClickListener(new NoDoubleClickListener() { @Override public void onNoDoubleClick(View v) { submitOrder(); } });
原理:
很簡單,見代碼……
就是用onNoDoubleClick代替onClick處理具體的操作,在onClick方法中加一個判斷:在接收到點(diǎn)擊事件之后,
先判斷一下時間,如果距離上次處理操作不足MIN_CLICK_DELAY_TIME,就忽視——即能防止誤操作的連續(xù)點(diǎn)擊導(dǎo)致重復(fù)事件。
MIN_CLICK_DELAY_TIME可調(diào)。
優(yōu)勢
好處是不用改變原有代碼的邏輯,就只需要兩個替換:NoDoubleClickListener代替OnClickListener,
onNoDoubleClick代替onClick。 代碼的結(jié)構(gòu)等都不需要做改變(**對比上面的代碼0跟代碼**3),
不需要關(guān)心處理更改button的狀態(tài)這些額外判斷邏輯,只需要關(guān)注業(yè)務(wù)邏輯即可,簡潔優(yōu)雅~
本文摘自 :https://blog.51cto.com/u