2018年五一假期框架知識整理之Android AOP編程思想

開篇廢話

真心非常感謝有這么一個五一假期恩溅,自己能夠挪出來這么一大塊的時間來好好學習,感覺無比幸福

近期谓娃,由于一個人的時間畢竟有限暴匠,工作上,學習上傻粘,生活上,都占用了太多時間帮掉,實在是沒有抽出來時間好好整理自己的一些知識點弦悉,更糟糕的是,本來想到了不少的知識點想分享的蟆炊,到今天想分享的時候稽莉,已經有點記不起哪些是當時想要分享的了,對此涩搓,我應該在一個日志工具中記錄一下污秆,免得出現(xiàn)現(xiàn)在這種情況。

近期花了一筆不少的錢報了一個在線進階的班昧甘,跟著老師系統(tǒng)的把Android知識學習一遍良拼,個人覺得還是挺值得的。因此充边,想著能把自己學到冰山一角整理一下庸推,鞏固一下自己的記憶,也供我們開發(fā)者一些參考浇冰。

廢話就不多說了贬媒,今天就簡單介紹一下AOP編程思想吧。肘习。际乘。


技術詳情

1. 什么是AOP

  官方釋義:面向切面編程,看到這個解釋漂佩,其實對于沒有接觸過AOP的人來說脖含,依然是一臉懵逼。
  我們可以聯(lián)想一下我們自己使用最多的一種思想投蝉,就是面向對象編程器赞。
  然后相較于面向對象,面向切面編程就是在多個功能中嵌入但又不是那個功能模塊的一個主要功能墓拜,舉個例子港柜,大概是這樣:
  A模塊負責網絡訪問模塊,B模塊負責本地數據庫模塊,C模塊負責日志打印模塊夏醉,那么A和B模塊里面都會嵌入
  C模塊爽锥,也就是都需要打印一些日志,供我們調試或者記錄畔柔,這個時候氯夷,我們就可以把C模塊當做A模塊和B模塊的一個共同切面,
  而不是在A模塊或者B模塊的各個地方都寫上的日志靶擦,而是集中在C模塊中進行管理腮考。

這么說可能還是不怎么好理解,那么我們就用代碼的方式來比較說明吧

2. AOP的簡易使用

首先玄捕,我們實現(xiàn)一個簡易的功能:計算某一段代碼運行的時長踩蔚,這樣,我們可以知道到底是哪一個地方或者方法耗時比較多枚粘,可以有針對的對我們的app進行優(yōu)化馅闽。

針對這個功能,我們應該在一段代碼運行前馍迄,記錄一個時間點福也,運行完,再用當前時間減去運行前的時間點攀圈,就會得出暴凑,這段代碼運行的時長。

實現(xiàn)代碼如下:

  /**
 * 模擬耗時操作:查詢數據庫
 * @param view
 */
public void onFetchDatabase(View view){
    long begin = System.currentTimeMillis();
    SystemClock.sleep(new Random().nextInt(2000));
    long duration = System.currentTimeMillis() - begin;
    Log.i(TAG,"本次查詢數據庫耗時: " + duration + "ms");
}

/**
 * 模擬耗時操作:訪問網絡服務器
 * @param view
 */
public void doNetAction(View view){
    long begin = System.currentTimeMillis();
    SystemClock.sleep(new Random().nextInt(2000));
    long duration = System.currentTimeMillis() - begin;
    Log.i(TAG,"本次訪問網絡服務器耗時: " + duration + "ms");
}


/**
 * 模擬耗時操作:保存本地文件
 * @param view
 */
public void saveLocalFile(View view){
    long begin = System.currentTimeMillis();
    SystemClock.sleep(new Random().nextInt(2000));
    long duration = System.currentTimeMillis() - begin;
    Log.i(TAG,"本次保存本地文件耗時: " + duration + "ms");
}

/**
 * 模擬耗時操作:做其他操作
 * @param view
 */
public void onDoOtherSomething(View view){
    long begin = System.currentTimeMillis();
    SystemClock.sleep(new Random().nextInt(2000));
    long duration = System.currentTimeMillis() - begin;
    Log.i(TAG,"本次操作耗時: " + duration + "ms");
}

從以上代碼赘来,我們可以看出來搬设,在每一個方法里面,都必須有一段相同的代碼來計算耗時撕捍,當我們的功能模塊很多很多的時候拿穴,這種寫法就會很蛋疼了,到時候后期維護也不得了忧风,這還只是單純的一個耗時統(tǒng)計功能而已默色,如果還有其他類似的功能呢?

那么狮腿,下面我們使用AOP的思想來完成這個功能腿宰,其中的好處,自行體會缘厢。

涉及的知識點有:

  1.自定義注解的簡易使用
  2.AspectJ的引入(可以理解為引入一個jar包)吃度,作為切面處理的一個工具類

首先創(chuàng)建一個自定義注解CalculateDuration :

  @Target(ElementType.METHOD)
  @Retention(RetentionPolicy.RUNTIME)
  public @interface CalculateDuration {
      String value();
  }

然后引入AspecgJ編譯器(一種與javac類似的編譯器,可以不用深究贴硫,能用就行)椿每,具體使用伊者,可以查看我的github源碼中的app模塊的gradle配置

接著就是實現(xiàn)切面的邏輯代碼:

@Aspect
public class CalculateDurationAspect {

  //TODO 定義切面的規(guī)則
  //TODO 1.就是原來的應用中,哪些注釋的地方放到當前切面進行處理
  //execution(注解名  注解用的地方)
  @Pointcut("execution(@senduo.com.aopdemo.annotation.CalculateDuration * *(..) )")
  public void methodAnonotatedWithCalculateDuration(){}

  //TODO 2.對進入切面的內容如何處理
  //advice
  //@Before() 在切入點之前運行
  //After()  在切入點之后運行
  / /Around() 在切入點前后運行
  @Around("methodAnonotatedWithCalculateDuration()")
  public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable{

      //獲取切面簽名
      MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
      //根據簽名 獲取更多的信息
      String className = methodSignature.getDeclaringType().getSimpleName();//類名
      String methodName = methodSignature.getName();//方法名
      String funName =       methodSignature.getMethod().getAnnotation(CalculateDuration.class).value();//功能名

      long begin = System.currentTimeMillis();
      Object result = joinPoint.proceed();//這里就是原先處理的邏輯
      long durarion = System.currentTimeMillis() - begin;
      Log.d("senduo",className + " " + methodName + " " + "本次" + funName + "耗時:" + durarion + "ms");

      return result;
  }
}

通過以上切面的實現(xiàn)间护,在我們最開始的那段代碼就變成一下的樣子了:

@CalculateDuration("查詢數據庫")
public void onFetchDatabase(View view){
    SystemClock.sleep(new Random().nextInt(2000));
}

@CalculateDuration("訪問網絡服務器")
public void doNetAction(View view){
    SystemClock.sleep(new Random().nextInt(2000));
}

@CalculateDuration("保存本地文件")
public void saveLocalFile(View view){
    SystemClock.sleep(new Random().nextInt(2000));
}

@CalculateDuration("做其他操作")
public void onDoOtherSomething(View view){
    SystemClock.sleep(new Random().nextInt(2000));
}

這樣亦渗,在這個地方,我們只需要關注自身的功能實現(xiàn)汁尺,而不需要插入那么多亂七八糟的代碼

關于此項目的源代碼法精,在文章最后,會提供github地址痴突,歡迎star

干貨總結

以上搂蜓,是這一次關于AOP編程思想知識的一個簡易整理,如果對于這一塊有興趣辽装,可以多花點時間帮碰,好好去研究,我這邊暫時也只能進行一個簡單陳述如迟。

此文章的作用有如下幾點:

  1.認識一下AOP編程
  2.能夠優(yōu)化我們工作中的一些全局業(yè)務(比如性能檢測,權限驗證攻走,資源釋放殷勘,用戶行為統(tǒng)計等)
  3.服務器那邊可通過AOP思想進行數據挖掘,數據分析

以下是此demo的源碼:

Android-AOP

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末昔搂,一起剝皮案震驚了整個濱河市玲销,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摘符,老刑警劉巖贤斜,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逛裤,居然都是意外死亡瘩绒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門带族,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锁荔,“玉大人,你說我怎么就攤上這事蝙砌⊙舳椋” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵择克,是天一觀的道長恬总。 經常有香客問我,道長肚邢,這世上最難降的妖魔是什么壹堰? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上缀旁,老公的妹妹穿的比我還像新娘记劈。我一直安慰自己,他們只是感情好并巍,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布目木。 她就那樣靜靜地躺著,像睡著了一般懊渡。 火紅的嫁衣襯著肌膚如雪刽射。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天剃执,我揣著相機與錄音誓禁,去河邊找鬼。 笑死肾档,一個胖子當著我的面吹牛摹恰,可吹牛的內容都是我干的。 我是一名探鬼主播怒见,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼俗慈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了遣耍?” 一聲冷哼從身側響起闺阱,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舵变,沒想到半個月后酣溃,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡纪隙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年赊豌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绵咱。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡亿絮,死狀恐怖,靈堂內的尸體忽然破棺而出麸拄,到底是詐尸還是另有隱情派昧,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布拢切,位于F島的核電站蒂萎,受9級特大地震影響,放射性物質發(fā)生泄漏淮椰。R本人自食惡果不足惜五慈,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一纳寂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泻拦,春花似錦毙芜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至架曹,卻和暖如春隘冲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绑雄。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工展辞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人万牺。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓罗珍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脚粟。 傳聞我的和親對象是個殘疾皇子覆旱,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容