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