亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android AOP基本用法全面詳解

 更新時間:2023年09月12日 11:50:46   作者:搬磚的兔子  
這篇文章主要為大家介紹了Android AOP基本用法全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

什么是AOP

AOP(Aspect Oriented Programming)意為面向切面編程,指通過預編譯方式和運行期間動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術。

其廣泛的應用在代碼的后期修改與維護之中,它對原代碼侵入性少,容易擴展輔助功能,可以使原執(zhí)行邏輯與改變執(zhí)行邏輯解耦。

現(xiàn)在有一個智能門,以前的開門的邏輯是:輸入密碼 -> 拎動把手 -> 開門,現(xiàn)在呢業(yè)主覺得密碼有可能被盜,不夠安全,希望加上指紋驗證。這時候我們只需要將 驗證指紋 這一步插入到 開門 之前就完成了,現(xiàn)在的邏輯是:輸入密碼 -> 拎動把手 -> 指紋驗證 -> 開門。這種思維就是一種面向切面的思維。

什么是AspectJ

要知道AOP只是一種編程思想,那么,在android中,我們該通過何種工具來實現(xiàn)這種思想呢,沒錯,就是AspectJ。要掌握AspectJ首先要明確下面的幾大概念:

Advice(通知):定義需要被注入到.class字節(jié)碼文件中的代碼,通俗點兒來說就是告訴編織器哪里是你需要插入的代碼。

  • @Pointcut :定義切點、標記方法以便于重用。
  • @Before :前置通知,其內容在切點之前執(zhí)行。
  • @Around :環(huán)繞通知,其內容貫穿整個切點前后。
  • @After:后置通知,其內容在切點之后執(zhí)行。
  • @AfterReturning:返回通知,其內容在切點返回結果后再執(zhí)行。
  • @AfterThrowing:異常通知,其內容在切點拋出異常時執(zhí)行。

JoinPoint(連接點):即允許你插入代碼的地方。

Pointcut(切入點):是對連接點的篩選與定義的一種表達式。

  • 如下圖所示,"execution(* android.view.View.OnClickListener.onClick(..))"是一個完整的切點表達式,它是由execution(<修飾符模式>? <返回類型模式> <方法名模式>(<參數(shù)模式>) <異常模式>?)組成的,其中<修飾符模式>和<異常模式>可以省略。

Aspect(切面):切面是通知和切入點的結合。

Weaving(織入):這個很好理解就是把我們定義好的切面注入到目標對象中去的過程。

基本用法

插件配置

//在根build.gradle下配置:
dependencies {
    ...
    classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.8' 
}
//在app/build.gradle下配置
apply plugin: 'com.hujiang.android-aspectjx'
aspectjx {
    //關閉AspectJX功能
    enabled true
    //織入遍歷符合條件的庫
    //includeJarFilter 'universal-image-loader', 'AspectJX-Demo/library'
    //排除包含‘universal-image-loader'的庫
    //excludeJarFilter 'universal-image-loader'
}

定義切面

創(chuàng)建一個類,并通過@Aspect定義為一個切面。

@Aspect
public class AspectTest {
    ......
}

創(chuàng)建通知、添加切點表達式

在該類中添加需要編織的方法,并通過通知和切點表達式來定義它。Ok,一個簡單的防抖的OnClick判斷就切入到你的程序中去了。相信其他業(yè)務你也能很好的利用AspectJ來處理了。

@Aspect
public class AspectTest {
    private static final String TAG = "AspectTest";
    @Around("execution(* android.view.View.OnClickListener.onClick(..))")
    public void onClickListener(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        Log.d(TAG, "onClick");
        if (!NoDoubleClickUtils.isDoubleClick()){
            proceedingJoinPoint.proceed();    //切回到切點并執(zhí)行后續(xù)代碼
        }
    }
}

補充:第三方庫兼容

有時候我們在使用AspectJ的時候可能會遇到引入了一些其他的三方庫的情況,而我們又需要對其內的連接點進行編織、切入。如上述點擊事件防抖的例子,可能用到了Butterknife來注解@onClick(),這時你會發(fā)現(xiàn)上述切入表達式不起作用了,為什么呢,我們看一下Butterknife中的@OnClick定義就知道了。

@Target(METHOD)
@Retention(RUNTIME)
@ListenerClass(
    targetType = "android.view.View",
    setter = "setOnClickListener",
    type = "butterknife.internal.DebouncingOnClickListener",
    method = @ListenerMethod(
        name = "doClick",
        parameters = "android.view.View"
    )
)
public @interface OnClick {
  /** View IDs to which the method will be bound. */
  @IdRes int[] value() default { View.NO_ID };
}

我們可以發(fā)現(xiàn)。其通過Annotation Processor對@OnClick進行掃描,并將android.view.View.OnClickListener.onClick方法替換為butterknife.internal.DebouncingOnClickListener.doClick方法。因此為了兼容ButterKnife上述切入點表達式應該改為如下方式,及對butterknife的OnClick方法進行切入。

@Around("execution(* android.view.View.OnClickListener.onClick(..)) || execution(@butterknife.OnClick * *(..))")
public void onClickListener(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
    Log.d(TAG, "onClick");
    if (!NoDoubleClickUtils.isDoubleClick()){
        proceedingJoinPoint.proceed();
    }
}

以上就是Android AOP基本用法全面詳解的詳細內容,更多關于Android AOP基本用法的資料請關注腳本之家其它相關文章!

相關文章

  • Android Studio實現(xiàn)補間動畫

    Android Studio實現(xiàn)補間動畫

    這篇文章主要為大家詳細介紹了Android Studio實現(xiàn)補間動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • android 9.0 launcher3 去掉抽屜式顯示所有 app(代碼詳解)

    android 9.0 launcher3 去掉抽屜式顯示所有 app(代碼詳解)

    本文通過實例代碼給大家介紹了android 9.0 Launcher3 去掉抽屜式,顯示所有 app,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Android中Lifecycle的原理詳解

    Android中Lifecycle的原理詳解

    大家好,本篇文章主要講的是Android中Lifecycle的原理詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 最新評論