前言
最近好多用戶吐槽我們公司app列表滑動(dòng)不跟手(就是滑動(dòng)的時(shí)候手指觸摸屏幕滑動(dòng)停不下來),初步推測是封裝的RecycleView有問題,于是進(jìn)行了一系列“診斷”,此過程中把封裝的RecycleView又重構(gòu)有擴(kuò)展完善的不能再完善了,開始懷疑人生了問題依然沒找到。接近奔潰正準(zhǔn)備放棄的時(shí)候,我在BaseActivity中發(fā)現(xiàn)了一段代碼
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// 判斷連續(xù)點(diǎn)擊事件時(shí)間差
if (ActivityUtil.isFastClick()) {
return true;
}
}
return super.dispatchTouchEvent(event);
}
ActivityUtil:
/********防止按鈕連續(xù)點(diǎn)擊********/
private static long lastClickTime;
public synchronized static boolean isFastClick() {
long time = System.currentTimeMillis();
if (time - lastClickTime < 500) {
return true;
}
lastClickTime = time;
return false;
}
看到這段代碼我估計(jì)大家都明白,你想的沒錯(cuò)就是防止按鈕重復(fù)點(diǎn)擊。請收回你的大笑,這個(gè)坑我跳進(jìn)去快一周了,終于找到根源了,當(dāng)時(shí)看到這段代碼我心里一頓草泥馬,畢竟接手該項(xiàng)目已經(jīng)超過2個(gè)月,寫這段代碼的大神早就不承認(rèn)了。
問題分析
原因很簡單就是fragment都是依附Activity ,每個(gè)Activity都繼承了這個(gè)BaseActivity,在BaseActivity 的dispatchTouchEvent中根據(jù)時(shí)間差做了事件的攔截,導(dǎo)致列表滑動(dòng)不跟手指。這里有一個(gè)知識(shí)點(diǎn)或者說面試經(jīng)常會(huì)問的知識(shí)
解決思路
到底Android按鈕多次點(diǎn)擊該怎么解決呢,同學(xué)們看到這里估計(jì)早就開罵了,上邊這么多廢話。不要著急哥就是這么個(gè)人。網(wǎng)上所有的解決方案很多核心原理就那么一個(gè):
通過每個(gè)按鈕點(diǎn)擊事件中,記錄點(diǎn)擊時(shí)間,判斷是否超過點(diǎn)擊時(shí)間間隔,
最終解決方案
Android優(yōu)雅地處理按鈕重復(fù)點(diǎn)擊
使用AOP來解決重復(fù)點(diǎn)擊,android studio編譯報(bào)錯(cuò)解決方案
如果你在使用AOP方式解決問的時(shí)候遇到了其他問題那就用這個(gè)Github
使用方式:要么自己引入第三方的庫,要么自己對照庫自己寫一套,不要傻乎乎的引入了第三方庫又自己寫了一套,如果你中招了可別說是認(rèn)識(shí)我