AOP即面向切面编程,相关知识可以自己先了解。
这里使用AOP来实现防止按钮重复点击的需求
一、项目配置
1、根目录build.gradle文件
代码语言:javascript复制buildscript {
dependencies {
...
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
}
}
2、app目录下进出3处配置
(1)、
代码语言:javascript复制apply plugin: 'android-aspectjx'
(2)、
代码语言:javascript复制android {
aspectjx {
include 'com.mxqx.xqxtest' // 这里为项目包名
}
}
(3)、
代码语言:javascript复制 implementation 'org.aspectj:aspectjrt:1.9.6'
二、使用
(1)、自定义注解类(这里可以自行学习下注解的相关知识)
代码语言:javascript复制import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SingleClick {
/* 点击间隔时间 */
long value() default 1000;
}
(2)、切面类
代码语言:javascript复制@Aspect
public class SingleClickAspect {
/**
* 定义切点,标记切点为所有被@SingleClick注解的方法
* 注意:这里com.mxqx.xqxtest.SingleClick需要替换成
* 你自己项目中SingleClick这个类的全路径哦
* pointcut指明了什么情况下执行切面方法,还有比如某些方法,某个路径的指定,可以自行学习
*/
@Pointcut("execution(@com.mxqx.xqxtest.SingleClick * *(..))")
public void method() {}
/**
* 定义一个切面方法,包裹切点方法
*/
@Around("method()")
public void aroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
// 取出方法的参数
View view = null;
for (Object arg : joinPoint.getArgs()) {
if (arg instanceof View) {
view = (View) arg;
break;
}
}
if (view == null) {
return;
}
// 取出方法的注解
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
if (!method.isAnnotationPresent(SingleClick.class)) {
return;
}
SingleClick singleClick = method.getAnnotation(SingleClick.class);
// 判断是否快速点击
if (!ClickUtils.isFastDoubleClick(view, singleClick.value())) {
// 不是快速点击,执行原方法
Log.i("xqxinfo","执行原方法");
joinPoint.proceed();
}else{
Log.i("xqxinfo","快速点击");
}
}
}
到此即实现了AOP的配置,接下来只需要在使用的方法前加上@SingleClick注解即可。当执行添加了@SingleClick注解的方法便会进去切面方法进行重复点击的相关判断
代码语言:javascript复制 // 点击事件
tvToCir.setOnClickListener(new View.OnClickListener() {
@SingleClick
@Override
public void onClick(View view) {
// 长方形变圆形
Log.i("xqxinfo","长方形变圆形");
rectToCir();
}
});
代码语言:javascript复制 @SingleClick
public void showLog(String name){
Log.i("xqxinfo","name->" name);
}
由于自定义注解SingleClick的默认值1000,当某些地方想更改点击间隔的时候可以写成@SingleClick(5000),即value赋值5000
代码语言:javascript复制 @SingleClick(5000)
public void showLog(String name){
Log.i("xqxinfo","name->" name);
}