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

首頁 > 系統 > Android > 正文

Android中AOP的應用實踐之過濾重復點擊

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

前言

大家對AOP應該都不陌生, 就算沒有用過也肯定聽說過,切面編程一直是一個熱點的話題,AOP即Aspect Oriented Programming的縮寫,習慣稱為切面編程;與OOP(面向對象編程)萬物模塊化的思想不同,AOP則是將涉及到眾多模塊的某一類問題進行統一管理,AOP的優點是將業務邏輯與系統化功能高度解耦,讓我們在開發過程中可以只專注于業務邏輯,其他一些系統化功能(如路由、日志、權限控制、攔截器、埋點、事件防抖等)則由AOP統一處理;

AspectJ簡介

AOP是一種編程思想,或者說方法論,AspectJ則是專為AOP設計的一種語言,它支持原生的JAVA,可用于在java中處理AOP的相關問題;下面非常簡單的描述下AspectJ中幾個要點

Join Points

AspectJ中的切點,是AspectJ作用到具體某個位置的說明,主要包括三類:

  • 函數(函數調用,函數執行,構造函數等)
  • 變量(變量get,變量set等)
  • 代碼塊(靜態代碼塊,for等)

Pointcuts

AspectJ中的切面(這種翻譯不一定正確),由點及面,用于說明你需要hook哪一類問題,比如我需要hook所有的Activity的生命周期方法,則:

@Pointcut("execution(* android.app.Activity.on*(..))") 

advice

Join Points和Pointcuts用來說明需要hook哪些位置或者流程,advice則用于hook之后指定需要做什么,包括:

before() 在切入點之前操作

after() 在切入點之后操作

  • after():returning 函數正常結束
  • after():throwing 函數異常結束

around() 完全替換函數(可以手動再調用原函數)

around()用的會比較多,因為自由度高,其他的用around()都可以實現

AOP處理android中的重復點擊

短時間的重復點擊如果不做處理會帶來不好的體驗且可能引發問題(打開多個頁面,多次提交,數據錯亂),之前我寫過一篇文章使用代理模式+反射來處理重復點擊的問題:Android-如何優雅的處理重復點擊 ,雖然這種方式能達到目的且還算靈活,但還是存在侵入性,對于業務邏輯不是完全透明,所以我們需要使用跟好的方式來處理;

AOP用于處理某一類獨立的問題,非常契合屏蔽重復點擊的需求,我們只需要hook住原先的點擊事件(轉確的說是點擊事件后的處理流程),判斷是不是重復點擊,是則過濾掉不讓它執行,否則就正常執行;

代碼

在Android中進行AspectJ的實現,建議使用Hujiang大神的框架gradle_plugin_android_aspectjx,可以非常方便的集成和配置AspectJ在Android中的環境

集成

//root gradle dependencies { classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.1' }//app或module gradleapply plugin: 'android-aspectjx' //插件compile 'org.aspectj:aspectjrt:1.8.9' //jar

AspectJ代碼

@Aspectpublic class ClickFilterHook { private static Long sLastclick = 0L; private static final Long FILTER_TIMEM = 1000L; @Around("execution(* android.view.View.OnClickListener.onClick(..))") public void clickFilterHook(ProceedingJoinPoint joinPoint) { if (System.currentTimeMillis() - sLastclick >= FILTER_TIMEM) { sLastclick = System.currentTimeMillis(); try { joinPoint.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); } } else { Log.e("ClickFilterHook", "重復點擊,已過濾"); } }}

測試

 //普通方式 ok mBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"有效點擊",Toast.LENGTH_SHORT).show(); } }); //butterknife等IOC框架 ok @OnClick({R.id.btn}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.btn: Toast.makeText(MainActivity.this,"有效點擊",Toast.LENGTH_SHORT).show(); break; } } //自定義view ok @BindView(R.id.tv_small_up) StrokeTextView mTvSmallUp; ... mTvSmallUp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"有效點擊",Toast.LENGTH_SHORT).show(); } });

可以發現,我們處理重復點擊的代碼,對于原先的代碼是沒有任何耦合的,對于業務邏輯是完全透明,甚至業務邏輯代碼里都沒有體現,這一類問題就已經被處理好了,而且是全局的處理;

說一下上面的代碼中幾個點:

1@Aspect:該注解用于標注使用Aspect的類,即你編寫Aspec代碼的類

2、@Around("...")

3、@Around注解用于標注hook之后的處理代碼,我們這里使用Around是因為原函數(onClick)可能執行,也可能不執行;注解中的參數則對應Pointcuts

  • "execution(* android.view.View.OnClickListener.onClick(..))"對應Pointcuts,即用一個類似正則表達式來告訴控制器你需要hook哪些函數(方法)
  • execution:表示hook的流程是函數執行過程(Join Points有很多種,execution只是其中一種,具體可參見AspectJ官方文檔)
    android.view.View.OnClickListener.onClick(..)) :表示android.view.View.OnClickListener該類(或接口)下的所有名為onClick,參數個數未知,參數類型未知的函數

總結

我們通過面向切面思想來過濾掉了重復點擊的事件,且高度解耦,可以看到代碼非常簡單,AOP重在理解這種思想且找準切入點;AOP在Android中還可以有非常多的應用,如:

  • Android API23+的權限控制
  • 無痕埋點
  • 全局是否登錄流程控制
  • 路由控制
  • 日志系統
  • 事件防抖(重復點擊)
  • ...

后面有機會再聊這些應用;文章如有任何描述不正確或欠妥的地方,還請大家務必提出來我及時改正,免得誤導更多盆友;

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久成年人免费电影| 中文字幕v亚洲ⅴv天堂| 2018国产精品视频| 国产精品v片在线观看不卡| 91香蕉电影院| 欧美一级大片在线免费观看| 欧美成人精品xxx| 亚洲精品久久久久国产| 一本色道久久综合狠狠躁篇的优点| 亚洲欧美在线一区| 亚洲视频在线观看网站| 久久久久久久久久国产| 欧美成人四级hd版| 亚洲va欧美va在线观看| 亚洲电影av在线| 精品亚洲aⅴ在线观看| 九色精品美女在线| 日韩精品久久久久| 日韩av在线一区| 亚洲视频免费一区| 欧美视频专区一二在线观看| 欧美成人激情图片网| 日韩美女视频在线观看| 少妇久久久久久| 亚洲香蕉成人av网站在线观看| 日韩资源在线观看| 国产精品第一区| 国产视频久久网| 亚洲精品按摩视频| 国产精品视频久久久久| 久久久人成影片一区二区三区| 国产精品久久久久不卡| 国外成人免费在线播放| 国产精品亚洲视频在线观看| 日韩在线视频网| 色综合天天狠天天透天天伊人| 美女啪啪无遮挡免费久久网站| 在线日韩第一页| 欧美激情精品久久久久久免费印度| 亚洲美女又黄又爽在线观看| 国产精品久久久亚洲| 日韩风俗一区 二区| 2023亚洲男人天堂| 亚洲国产精品久久久久秋霞不卡| 欧美视频一二三| 成人激情春色网| 久久天天躁狠狠躁老女人| 欧美老少做受xxxx高潮| 大荫蒂欧美视频另类xxxx| 91探花福利精品国产自产在线| 久久不射电影网| www.欧美精品| 国产精品白丝jk喷水视频一区| 亚洲激情在线视频| 91精品久久久久久久久久久| 欧美激情精品久久久久久蜜臀| 久久久久久国产精品三级玉女聊斋| 日韩中文字幕免费看| 亚洲欧洲一区二区三区久久| 久久欧美在线电影| 亚洲天堂男人的天堂| 色琪琪综合男人的天堂aⅴ视频| 91九色蝌蚪国产| 欧美一区在线直播| 欧美综合在线观看| 欧美日韩在线视频一区二区| 在线观看视频亚洲| 欧美激情国产精品| 欧美日韩福利视频| 欧美午夜视频在线观看| 美女啪啪无遮挡免费久久网站| 国产精品日韩电影| 亚洲精品一区中文字幕乱码| 欧美成人sm免费视频| 欧美性猛交xxxx黑人| 国色天香2019中文字幕在线观看| 欧洲精品毛片网站| 日韩激情在线视频| 琪琪第一精品导航| 日韩三级影视基地| www国产亚洲精品久久网站| 成人欧美在线观看| 欧美日韩国产在线| 欧美影院久久久| 欧美综合在线第二页| 欧美性生交xxxxx久久久| 91精品久久久久久久久| 欧美高清在线播放| 青青久久av北条麻妃海外网| 国产亚洲精品久久久久动| 欧美在线观看视频| 国产精品入口夜色视频大尺度| 欧美日韩国产精品| 亚洲最大激情中文字幕| 91av在线播放视频| 91精品久久久久久综合乱菊| 91精品国产自产91精品| 91精品国产成人www| 91精品国产乱码久久久久久久久| 亚洲护士老师的毛茸茸最新章节| 综合国产在线视频| 久久久噜噜噜久久久| 亚洲视频网站在线观看| 久久99视频免费| 亚洲理论电影网| 精品国内自产拍在线观看| 萌白酱国产一区二区| 久久中文字幕一区| 国产婷婷成人久久av免费高清| 91久久国产精品91久久性色| 欧美午夜视频一区二区| 亚洲午夜未满十八勿入免费观看全集| 欧美最猛性xxxxx亚洲精品| 国产欧美久久久久久| 亚洲第一网站男人都懂| 精品电影在线观看| 一区二区三区四区在线观看视频| 日韩国产高清视频在线| 久久中文久久字幕| 久久国产视频网站| 亚洲视频在线观看视频| 成人免费视频网址| 欧美肥老太性生活视频| xxxx欧美18另类的高清| 欧美日韩免费在线观看| 国产精品激情av电影在线观看| 久久国产精品久久久久| 国产精品九九久久久久久久| 91精品国产99久久久久久| 久久综合九色九九| 亚洲有声小说3d| 91国产视频在线播放| 亚洲国产一区二区三区在线观看| 亚洲国产精品成人va在线观看| www.国产精品一二区| 欧美美女18p| 日韩欧美在线网址| 亚洲成人中文字幕| 国产成+人+综合+亚洲欧洲| 国产精品1区2区在线观看| 亚洲第一男人天堂| 麻豆国产精品va在线观看不卡| 日韩视频在线免费观看| 97久久精品国产| 欧美另类暴力丝袜| 亚洲老头同性xxxxx| 欧美激情乱人伦| 美女啪啪无遮挡免费久久网站| 精品国产乱码久久久久久天美| 国产精品99久久99久久久二8| 日本不卡免费高清视频| 亚洲综合成人婷婷小说| 欧美黄色性视频| 最新国产精品拍自在线播放| 亚洲欧美在线免费观看| 欧美成人午夜免费视在线看片| 久久久久一本一区二区青青蜜月| 精品视频久久久久久久| 久久久视频在线| 国产91精品久久久久久| 久久综合色影院| 成人久久久久久久| 亚洲欧洲成视频免费观看| 日韩av手机在线|