背景:在測試中,測試MM總喜歡連續重復點擊Button,如果click事件的處理業務,稍微有些耗時,或者設備反應比較慢時,就會響應2遍處理,導致錯誤的現象出現。
前提:click事件的處理業務,是耗時操作(允許在主線程限制以內的耗時)
發生情景:UI中單個button & 多個button
解決方案有兩種:1.setEnabled() 2.添加標志量mClicked 3.判斷相鄰兩次點擊的時間間隔
對于單個button處理較簡單
方案1:onClick() { setEnabled(false); businessHandle(End: setEnabled(true);)} //不推薦,體驗效果很不好
方案2:onClick() { if(mClicked) return; mClicked = true; businessHandle(End: mClicked = false;)}
方案3:onClick() {?if(isFastClick()) return; mClickLastTime?= System.currentTimeMillis();?businessHandle()}
private static final long MAX_FAST_CLICK_INTERVAL = 500;
private long mClickLastTime;
private boolean isFastClick() {
long clickTime = System.currentTimeMillis();
if (clickTime - mClickLastTime> 0
&& clickTime - mClickLastTime<= MAX_FAST_CLICK_INTERVAL) {
return true;
}
return false;
}
?
對于多個button需要增加handler特殊處理,防止button響應錯亂
Handler mHandler = new Handler(){
handleMessage(msg) {
if(msg.what == ClickWhat) {
switch(msg.obj == vId) {setEnabled(false);?HandleForvId(End:?setEnabled(true))}?//不推薦,體驗效果很不好
//switch(msg.obj == vId) {mClicked=true;?HandleForvId(End: mClicked=false)}
//switch(msg.obj == vId) {mClickLastTime?= System.currentTimeMillis();HandleForvId();}
}
}
方案1:onClick() {mHandler.obtainMessage(what, v.getId())}
方案2:onClick(View v) {if(mClicked) return;mHandler.obtainMessage(what, v.getId())}
方案3:onClick(View v) {if(isFastClick()) return;?mHandler.obtainMessage(what, v.getId())}