安卓按鈕防抖動之終極解決方案

開發(fā)過程中迈螟,我們經(jīng)常會用到OnClick點(diǎn)擊事件弄息,常用的寫法可能是這樣的:

btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO
            }
        });

或者是這樣的:

btn.setOnClickListener(this);

@Override
public void onClick(View v) {
   //TODO
}

正常情況下海渊,這樣的代碼是沒有什么問題的绵疲,但是大家都知道安卓碎片化嚴(yán)重,每個手機(jī)的性能也千差萬別臣疑。想必大家都遇到過盔憨,在比較卡的手機(jī)上,快速點(diǎn)擊按鈕打開一個頁面讯沈,結(jié)果發(fā)現(xiàn)這個頁面被打開了兩次...

一般這種情況下郁岩,我們會打開百度,看看萬能的網(wǎng)友都是怎么處理這種問題的(當(dāng)時我就是這么做的??)缺狠,搜索到的處理方式可能是這樣的:

btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO
                btn.setClickable(false);
                btn.setEnabled(false);
            }
        });

也可能是這樣的:

public abstract class NoDoubleClickListener implements OnClickListener {

    public static final int MIN_CLICK_DELAY_TIME = 1000;
    private long lastClickTime = 0;

    @Override
    public void onClick(View v) {
        long currentTime = Calendar.getInstance().getTimeInMillis();
        if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME{
            lastClickTime = currentTime;
            onNoDoubleClick(v);
        } 
     }  
 
    public abstract void onNoDoubleClick(View v);
}

btn.setOnClickListener(new NoDoubleClickListener() {
            @Override
            public void onNoDoubleClick(View v) {
                 //TODO
            }
        }); 

還有的說用RxBinding问慎,由于涉及到Rxjava相關(guān)的知識,篇幅原因挤茄,我這里就不過多描述如叼,感興趣的同學(xué)可以自行百度了解。

當(dāng)然穷劈,上述幾種方式均能達(dá)到防止按鈕快速點(diǎn)擊笼恰,但是其弊端也比較明顯。先說第一種方式歇终,這種方法雖然可以防止快速點(diǎn)擊社证,但是其給體驗(yàn)上的影響還是非常大的,想想如果你這個按鈕點(diǎn)擊后會有網(wǎng)絡(luò)請求练湿,如果網(wǎng)絡(luò)請求執(zhí)行過程比較長的話猴仑,按鈕一直無法被點(diǎn)擊审轮,會讓用戶以為出現(xiàn)了bug肥哎;方式二相比第一種方法辽俗,體驗(yàn)上倒是沒什么問題,但是其弊端在于只能通過匿名內(nèi)部類的方式注冊點(diǎn)擊事件篡诽,當(dāng)出現(xiàn)一個界面按鈕比較多崖飘,寫起來代碼就顯得比較臃腫了。

說了這么多杈女,是時候展示真正的技術(shù)了朱浴,不多BB,直接上代碼达椰。

首先我們定義一個點(diǎn)擊事件接口

public interface OnLimitClickListener {

    /**
     * 按鈕點(diǎn)擊事件
     * @param view
     */
    void onClick(View view);

}

再定義一個抽象類對我們的點(diǎn)擊事件做一層包裝

public class OnLimitClickHelper implements View.OnClickListener {
    public static final int LIMIT_TIME = 300;
    private long lastClickTime = 0;
    private OnLimitClickListener onLimitClickListener = null;

    public OnLimitClickHelper(OnLimitClickListener onLimitClickListener){
        this.onLimitClickListener = onLimitClickListener;
    }

    @Override
    public void onClick(View v) {
        long curTime = Calendar.getInstance().getTimeInMillis();
        if (curTime - lastClickTime > LIMIT_TIME) {
            lastClickTime = curTime;
            if(onLimitClickListener != null){
                onLimitClickListener.onClick(v);
            }
        }
    }
}

ok,完工翰蠢!??????

最后我們看看Activity的使用:

public abstract class MainActivity extends AppCompatActivity implements OnLimitClickListener {
    private Button btn = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.btn);
        btn.setOnClickListener(new OnLimitClickHelper(this));
    }

    @Override
    public void onClick(View v) {
        //TODO
    }
}

覺得寫的不錯的朋友,幫忙點(diǎn)下喜歡啰劲,你們的支持是我創(chuàng)作的動力梁沧!大家有什么問題也可以在下方評論,有時間我會一一解答蝇裤,感謝廷支!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市栓辜,隨后出現(xiàn)的幾起案子恋拍,更是在濱河造成了極大的恐慌,老刑警劉巖藕甩,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件施敢,死亡現(xiàn)場離奇詭異,居然都是意外死亡辛萍,警方通過查閱死者的電腦和手機(jī)悯姊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贩毕,“玉大人悯许,你說我怎么就攤上這事』越祝” “怎么了先壕?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谆甜。 經(jīng)常有香客問我垃僚,道長,這世上最難降的妖魔是什么规辱? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任谆棺,我火速辦了婚禮,結(jié)果婚禮上罕袋,老公的妹妹穿的比我還像新娘改淑。我一直安慰自己碍岔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布朵夏。 她就那樣靜靜地躺著蔼啦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仰猖。 梳的紋絲不亂的頭發(fā)上捏肢,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音饥侵,去河邊找鬼鸵赫。 笑死,一個胖子當(dāng)著我的面吹牛躏升,可吹牛的內(nèi)容都是我干的奉瘤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煮甥,長吁一口氣:“原來是場噩夢啊……” “哼盗温!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起成肘,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卖局,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后双霍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砚偶,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年洒闸,在試婚紗的時候發(fā)現(xiàn)自己被綠了染坯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡丘逸,死狀恐怖单鹿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情深纲,我是刑警寧澤仲锄,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站湃鹊,受9級特大地震影響儒喊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜币呵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一怀愧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦芯义、人聲如沸肛搬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛤奢,卻和暖如春鬼癣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啤贩。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工待秃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痹屹。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓章郁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親志衍。 傳聞我的和親對象是個殘疾皇子暖庄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容