Android防止點(diǎn)擊過快造成多次響應(yīng)事件的解決方法
最近開發(fā)過過成中遇到一些小問題,比如一個(gè)btn點(diǎn)擊用戶可能只點(diǎn)擊了一次但是后臺(tái)響應(yīng)了多次,像一些表單的提交出現(xiàn)這種問題比較棘手,當(dāng)然解決這種問題的方案比較多:比如自定義單次點(diǎn)擊的btn,或者在點(diǎn)擊的時(shí)候?qū)粹o設(shè)置為不可點(diǎn)擊,或者做一個(gè)計(jì)時(shí)器等等,這些都是解決的方案,至于具體怎么使用,這就要看程序員的編碼風(fēng)格了,首先來看看具體問題:
onClick事件是Android開發(fā)中最常見的事件。比如,一個(gè)Button,功能是點(diǎn)擊會(huì)提交一個(gè)訂單,則一般代碼如下 :
btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { submitOrder(); } });
正常情況下這段代碼是沒什么問題的,但是Android設(shè)備的機(jī)型性能等千差萬別,如果碰到比較卡的手機(jī),則有可能出現(xiàn)submitOrder()函數(shù)跳轉(zhuǎn)頁面出現(xiàn)延遲的現(xiàn)象。碰到這種現(xiàn)象,則用戶就很有可能再次點(diǎn)擊一次,從而造成函數(shù)被調(diào)用兩次,出現(xiàn)重復(fù)訂單的BUG。 一般地,碰到這現(xiàn)象,首先就會(huì)想到的就是在點(diǎn)擊之后把submitButton設(shè)置為不可點(diǎn)擊:
//代碼 btn.setClickable(false); //或者 btn.setEnabled(false);
此方法也確實(shí)有效,不過如果submitOrder()方法沒有成功,需要再次提交訂單時(shí)又需要再重復(fù)把submitButton設(shè)置為可點(diǎn)擊狀態(tài)。如果類似的button比較多時(shí),就顯得比較麻煩、混亂。
下面介紹一下我的處理方法:
自定義一個(gè)CheckDoubleClickListener,繼承自O(shè)nClickListener,其中的OnCheckDoubleClick是自定義的一個(gè)接口,具體看代碼:
CheckDoubleClickListener.Java
package com.huaxia.finance.javastudy.CheckDoubleClick; import android.view.View; import java.util.Calendar; /** * * Created by lp on 2016/12/29. */ public class CheckDoubleClickListener implements View.OnClickListener { public static final int MIN_CLICK_DELAY_TIME = 1000; private long lastClickTime = 0; private OnCheckDoubleClick checkDoubleClick; public CheckDoubleClickListener(OnCheckDoubleClick checkDoubleClick){ this.checkDoubleClick = checkDoubleClick; } @Override public void onClick(View v) { long currentTime = Calendar.getInstance().getTimeInMillis(); if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) { lastClickTime = currentTime; checkDoubleClick.onCheckDoubleClick(v); } } }
OnCheckDoubleClick.java
package com.huaxia.finance.javastudy.CheckDoubleClick; import android.view.View; /** * Created by lp on 2016/12/29. */ public interface OnCheckDoubleClick { void onCheckDoubleClick(View view); }
使用方法:
給btn設(shè)置點(diǎn)擊事件時(shí)用CheckDoubleClickListener代替OnClickListener,并且實(shí)現(xiàn)方法onCheckDoubleClick代替onClick即可,像這樣:
package com.huaxia.finance.javastudy; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.huaxia.finance.javastudy.CheckDoubleClick.CheckDoubleClickListener; import com.huaxia.finance.javastudy.CheckDoubleClick.OnCheckDoubleClick; public class CheckDoubleClickActivity extends Activity implements OnCheckDoubleClick { private Button btn; private CheckDoubleClickListener checkDoubleClickListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_check_double_click); checkDoubleClickListener = new CheckDoubleClickListener(this); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(checkDoubleClickListener); } @Override public void onCheckDoubleClick(View view) { Toast.makeText(CheckDoubleClickActivity.this, "Click Response", Toast.LENGTH_SHORT).show(); } }
原理:
就是用onCheckDoubleClick代替onClick處理具體的操作,在onClick方法中加一個(gè)判斷:在接收到點(diǎn)擊事件之后,先判斷一下時(shí)間,如果距離上次處理操作不足MIN_CLICK_DELAY_TIME,就忽視——即能防止誤操作的連續(xù)點(diǎn)擊導(dǎo)致重復(fù)事件。MIN_CLICK_DELAY_TIME可調(diào)。
優(yōu)勢:
好處是不用改變?cè)写a的邏輯,就只需要兩個(gè)替換:CheckDoubleClickListener代替OnClickListener,onCheckDoubleClick代替onClick。 代碼的結(jié)構(gòu)等都不需要做改變,不需要關(guān)心處理更改btn的狀態(tài)這些額外判斷邏輯,只需要關(guān)注業(yè)務(wù)邏輯即可,代碼是不是變得很簡潔了呢?一起加油吧。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)仿微軟系統(tǒng)加載動(dòng)畫效果
這篇文章主要介紹了Android實(shí)現(xiàn)仿微軟系統(tǒng)加載動(dòng)畫效果的方法,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04Android編程實(shí)現(xiàn)ListView內(nèi)容無限循環(huán)顯示的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)ListView內(nèi)容無限循環(huán)顯示的方法,通過繼承Adapter類實(shí)現(xiàn)ListView中的數(shù)據(jù)無限循環(huán)顯示功能,需要的朋友可以參考下2017-06-06Android Drawerlayout實(shí)現(xiàn)側(cè)滑菜單效果
這篇文章主要為大家詳細(xì)介紹了Android Drawerlayout實(shí)現(xiàn)側(cè)滑菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Android使用ViewFlipper和GestrueDetector共同實(shí)現(xiàn)滑屏效果實(shí)例
這篇文章主要介紹了Android使用ViewFlipper和GestrueDetector共同實(shí)現(xiàn)滑屏效果,結(jié)合完整實(shí)例形式分析了ViewFlipper和GestrueDetector控件實(shí)現(xiàn)滑屏功能的布局與相關(guān)操作技巧,需要的朋友可以參考下2017-02-02Android?MaterialAlertDialogBuilder修改按鈕屬性
這篇文章主要介紹了Android?MaterialAlertDialogBuilder修改按鈕屬性實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11kotlin實(shí)現(xiàn)語音聊天機(jī)器人案例詳解
Android智能問答機(jī)器人是時(shí)下非常流行的一種服務(wù),微軟“小冰”的出現(xiàn)更是讓其實(shí)實(shí)在在的風(fēng)靡了一把。那么,本文章就將帶領(lǐng)大家完整的實(shí)現(xiàn)整個(gè)問答機(jī)器人的制作2023-02-02Android開發(fā)中下拉刷新如何實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)中下拉刷新的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-07-07