Android项目实战(六十二):AOP实现防止重复点击

2022-05-07 19:13:26 浏览数 (1)

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);
    }
aop

0 人点赞