Android 快速多次點(diǎn)擊解決方案

前言

最近好多用戶吐槽我們公司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事件分發(fā)機(jī)制

解決思路

到底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í)我

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容