亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android中如何優雅的處理重復點擊實例代碼

2019-10-21 21:38:42
字體:
來源:轉載
供稿:網友

問題

有時候有些操作是防止用戶在一次響應結束中再響應下一個。但有些測試用戶就要猛點,狂點。像這種惡意就要進行防止。

比如在客戶端中,一些按鈕一般是需要避免重復點擊的,比如:購買丶支付丶確定丶提交丶點贊丶收藏等等場景,這些場景短時間內的重復點擊會引發一些問題.

下面話不多說了,來一起看看詳細的介紹吧

以前的處理方式

可能是采用手動記錄最后的點擊時間,再通過計算時間間隔來判斷是否重復點擊

 private long mLastClickTime = 0; public static final int TIME_INTERVAL = 1000; private Button mButton; private void initView() { mButton.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  if (System.currentTimeMillis() - mLastClickTime >= TIME_INTERVAL) {   //to do   mLastClickTime = System.currentTimeMillis();  } else {   Toast.makeText(getActivity(), "請勿重復點擊", Toast.LENGTH_LONG).show();  }  } }); }

或者封裝一下采用抽象處理

public abstract class IClickListener implements View.OnClickListener { private long mLastClickTime = 0; public static final int TIME_INTERVAL = 1000; @Override public final void onClick(View v) { if (System.currentTimeMillis() - mLastClickTime >= TIME_INTERVAL) {  onIClick(v);  mLastClickTime = System.currentTimeMillis(); } else {  onAgain(v); } } protected abstract void onIClick(View v); protected void onAgain(View v) { }}

使用(無需提醒重復點擊)

 mButton.setOnClickListener(new IClickListener() {  @Override  protected void onIClick(View v) {    } });

或者(需提醒重復點擊)

        mButton.setOnClickListener(new IClickListener() {
            @Override
            protected void onIClick(View v) {
                
            }

            @Override
            protected void onAgain(View v) {

            }
        });
可以看到經過封裝之后,使用起來還是很方便的,但是有幾個缺點

  • 侵入性過大-OnClickListener全部替換為子類IClickListener
  • 不可逆-不能很方便的還原為OnClickListener,因為不是同個回調
  • 如果是第三方控件則無法處理重復點擊
  • 只能寫成內部類方式-由于單繼承特性,我們只能內部類回調,代碼不美觀

優雅的處理方式

重復點擊的問題其實是如何動態控制原有的點擊事件是否產生,而不是在原有的點擊事件上增強功能;結合設計模式可以知道,代理模式可以很好的處理這種問題,而不是繼承.

代理

public class ClickProxy implements View.OnClickListener { private View.OnClickListener origin; private long lastclick = 0; private long timems = 1000; public ClickProxy(View.OnClickListener origin) {  this.origin = origin; } @Override public void onClick(View v) {  if (System.currentTimeMillis() - lastclick >= timems) {   origin.onClick(v);   lastclick = System.currentTimeMillis();  } }}

原先的點擊事件

  mButton.setOnClickListener(new View.OnClickListener() {   @Override   public void onClick(View v) {    //to do   }  });

代理使用

  mButton.setOnClickListener(new ClickProxy(new View.OnClickListener() {   @Override   public void onClick(View v) {    //to do   }  }));

可以看到,原有代碼邏輯沒有改動,只是添加了代理類,這樣大大減小了侵入性

當然還可以擴展一下,提供重復點擊的回調和自定義間隔時間,增加一個構造函數

public class ClickProxy implements View.OnClickListener { private View.OnClickListener origin; private long lastclick = 0; private long timems = 1000; //ms private IAgain mIAgain; public ClickProxy(View.OnClickListener origin, long timems, IAgain again) {  this.origin = origin;  this.mIAgain = again;  this.timems = timems; } public ClickProxy(View.OnClickListener origin) {  this.origin = origin; } @Override public void onClick(View v) {  if (System.currentTimeMillis() - lastclick >= timems) {   origin.onClick(v);   lastclick = System.currentTimeMillis();  } else {   if (mIAgain != null) mIAgain.onAgain();  } } public interface IAgain {  void onAgain();//重復點擊 }}

如何處理第三方View內部的點擊事件

可能我們使用一個自定義控件,他的內部已經消費了點擊事件,但是需要避免重復點擊,我們不可能去改內部的代碼,也不能重新設置點擊事件,那樣會丟失內部的處理邏輯;這時可以采用反射的處理方式,再結合代理來實現無縫替換

//提供一個靜態方法public class ClickFilter { public static void setFilter(View view) {  try {   Field field = View.class.getDeclaredField("mListenerInfo");   field.setAccessible(true);   Class listInfoType = field.getType();   Object listinfo = field.get(view);   Field onclickField = listInfoType.getField("mOnClickListener");   View.OnClickListener origin = (View.OnClickListener) onclickField.get(listinfo);   onclickField.set(listinfo, new ClickProxy(origin));  } catch (Exception e) {   e.printStackTrace();  } }}

使用:

 private StateButton mStateButton;//自定義控件 private void initView() {  ClickFilter.setFilter(mStateButton); }

這種動態替換的方式同樣適合普通場景,在設置點擊事件后,都可以通過設置該過濾器來處理重復點擊(包括butterknife等注解綁定的點擊事件)

最后

Ok.以上就是討論如何優雅處理重復點擊的全部內容,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久国产| 日韩av免费看网站| 亚洲精品国产精品国产自| 7m精品福利视频导航| 97国产成人精品视频| 亚洲天堂av电影| 亚洲美女动态图120秒| 欧美精品久久久久久久| 亚洲国产精品一区二区三区| 欧美电影第一页| 91大神福利视频在线| 2019亚洲日韩新视频| 欧美成年人视频网站| 成人h视频在线| 成人免费网视频| 91九色国产视频| 青青草99啪国产免费| 日韩亚洲成人av在线| 97色伦亚洲国产| 亚洲精品美女久久| 亚洲欧美日韩天堂一区二区| 亚洲性生活视频在线观看| 久久香蕉频线观| 一本一本久久a久久精品综合小说| 欧美大奶子在线| 国产精品视频xxxx| 亚洲国产欧美一区二区丝袜黑人| 亚洲毛片在线看| 久久噜噜噜精品国产亚洲综合| 欧美疯狂xxxx大交乱88av| 久久精品视频在线| 国产精品入口福利| 日韩av免费在线播放| 亚洲欧美在线一区二区| 91精品国产免费久久久久久| 欧美日韩亚洲激情| 日韩中文字幕免费看| 久久久久久久久久久亚洲| 欧美精品中文字幕一区| 日韩欧美999| 欧美黑人xxx| 亚洲黄页网在线观看| 色狠狠av一区二区三区香蕉蜜桃| 尤物yw午夜国产精品视频| 色偷偷av一区二区三区| 亚洲精品丝袜日韩| 海角国产乱辈乱精品视频| 国产精品美女呻吟| 大胆人体色综合| 久久香蕉国产线看观看av| 狠狠久久亚洲欧美专区| 国产午夜精品全部视频在线播放| 日韩乱码在线视频| www.日韩不卡电影av| 中文字幕日韩欧美在线| 欧洲成人免费视频| 欧美午夜视频在线观看| 国产精品福利网| 久久久久久av| 国产精品久久久av久久久| 97久久久久久| 亚洲欧美制服另类日韩| 热re99久久精品国产66热| 欧美成人亚洲成人日韩成人| 成人免费大片黄在线播放| 国产在线观看91精品一区| 精品久久久久久久久久| 一区二区三区视频在线| 人人做人人澡人人爽欧美| 久久99亚洲热视| 高清欧美性猛交xxxx| 国产+人+亚洲| 法国裸体一区二区| 精品呦交小u女在线| 91青草视频久久| 97香蕉超级碰碰久久免费的优势| 亚洲专区中文字幕| 欧美最猛性xxxxx免费| 亚洲精品一区二区在线| 亚洲无av在线中文字幕| 亚洲午夜精品视频| 欧美成人精品xxx| 亚洲高清色综合| 亚洲福利影片在线| 国产裸体写真av一区二区| 久久av资源网站| 久久精品免费电影| 欧美性理论片在线观看片免费| 一级做a爰片久久毛片美女图片| 国产亚洲精品久久久久动| 中文字幕一区二区精品| 欧美激情一区二区三区在线视频观看| 国产日韩综合一区二区性色av| 久久人人97超碰精品888| 日韩免费黄色av| 欧美一区二区影院| 亚洲国产一区自拍| 欧美成人四级hd版| 国模叶桐国产精品一区| 欧美一性一乱一交一视频| 欧美美女18p| 久久躁狠狠躁夜夜爽| 国产成人综合一区二区三区| 久久久在线观看| 国产亚洲精品一区二555| 国产精品91视频| 日韩欧美在线免费观看| 亚洲精品短视频| 国产精品小说在线| 亚洲跨种族黑人xxx| 日韩在线观看精品| 精品国产乱码久久久久久虫虫漫画| 日本国产欧美一区二区三区| 久久精品中文字幕电影| 亚洲qvod图片区电影| 久久亚洲国产精品| 粉嫩av一区二区三区免费野| 伊人精品在线观看| 国内精品久久久久伊人av| 日韩高清电影好看的电视剧电影| 久久视频在线观看免费| 91亚洲va在线va天堂va国| 久久久久久噜噜噜久久久精品| 91精品久久久久久久久| 68精品国产免费久久久久久婷婷| 亚洲日本欧美中文幕| 国产成人在线一区| 国产一区二区三区18| 亚洲va欧美va国产综合剧情| 国产精品久久久久久久久免费看| 欧美日韩精品国产| 97超级碰碰人国产在线观看| 色综合五月天导航| 最近2019中文字幕一页二页| 欧美丝袜美女中出在线| 亚洲欧美国产精品专区久久| www国产亚洲精品久久网站| 一区二区国产精品视频| 亚洲欧美日本伦理| 亚洲一区二区三区777| 欧美日韩第一视频| 69国产精品成人在线播放| 这里只有精品视频在线| 亚洲欧美国产一本综合首页| 久久国产精彩视频| 欧美男插女视频| 国产精品白嫩美女在线观看| 亚洲香蕉成视频在线观看| 精品国产网站地址| 精品国产一区二区三区久久久| 国产精品久久久久高潮| 欧美在线中文字幕| 国产精品影片在线观看| 成人444kkkk在线观看| 一区二区三区视频在线| 国产精品jizz在线观看麻豆| 黄色精品一区二区| 国产精品激情av在线播放| 国产www精品| 日韩激情在线视频| 国产精品久久久91| 国产精品一区二区性色av| 91国内精品久久| 久久99热这里只有精品国产|