背景:在测试中,测试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())}