Android开发经验谈Android技术知识Android开发

Android | 一文带你全面了解 AspectJ 框架

2020-03-03  本文已影响0人  彭旭锐

前言


目录

Editing...


1、面向切面编程 简介

面向切面编程 示意图

2、AspectJ 框架简介

AspectJ 示意图

3. 相关概念

Editing...

4. 示例 —— 限制按钮快速点击

步骤1:添加依赖

步骤2:判断View快速点击的工具类

public class FastClickCheckUtil {

    /**
     * 判断是否属于快速点击
     *
     * @param view     点击的View
     * @param interval 快速点击的阈值
     * @return true:快速点击
     */
    public static boolean isFastClick(@NonNull View view, int interval) {
        // 实现省略,详见上述文章
    }
}

步骤3:定义Aspect切面

使用@Aspect注解描述一个切面,使用该注解修饰的类会被AspectJ编译器识别为切面类:

@Aspect
public class FastClickCheckerAspect {
    // 随后填充
}

步骤4:定义PointCut切入点

使用@Pointcut注解描述一个切入点,编译期AspectJ编译器将搜索所有匹配的JoinPoint,执行织入:

@Aspect
public class FastClickCheckerAspect {

    // 定义一个切入点:View.OnClickListener#onClick()方法
    @Pointcut("execution(void android.view.View.OnClickListener.onClick(..))")
    public void methodViewOnClick() {
    }

    // 随后填充 Advice
}

步骤5:定义Advice增强

增强的方式有很多种,在这里我们使用@Around注解定义环绕增强,它将包装PointCut,在PointCut前后增加横切逻辑,具体如下:

@Aspect
public class FastClickCheckerAspect {
    
    // 定义切入点:View.OnClickListener#onClick()方法
    @Pointcut("execution(void android.view.View.OnClickListener.onClick(..))")
    public void methodViewOnClick() {
    }

    // 定义环绕增强,包装methodViewOnClick()切入点
    @Around("methodViewOnClick()")
    public void aroundViewOnClick(ProceedingJoinPoint joinPoint) throws Throwable {
        // 取出目标对象
        View target = (View) joinPoint.getArgs()[0];
        // 根据点击间隔是否超过2000,判断是否为快速点击
        if (!FastClickCheckUtil.isFastClick(target, 2000)) {
            joinPoint.proceed();
        }
    }
}

步骤6:实现View.OnClickListener

在这一步我们为View设置OnClickListener,可以看到我们并没有添加限制快速点击的相关代码,增强的逻辑对原有逻辑没有侵入,具体代码如下:

// 源码:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.text).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("AspectJ","click");
            }
        });
    }
}

小结

到这里,我们就展示完使用AspectJ限制快速点击的示例了,请务必查看文章:《Android | 使用 AspectJ 限制按钮快速点击》 查看完整示例。接下来我们将具体描述AspectJ的每个使用步骤。


5. JoinPoint 连接点

Editing...


6. PointCut 表达式

Editing...

上一篇 下一篇

猜你喜欢

热点阅读