前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android项目实战(六十二):AOP实现防止重复点击

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

作者头像
听着music睡
发布2022-05-07 19:13:26
9710
发布2022-05-07 19:13:26
举报
文章被收录于专栏:Android干货Android干货

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);
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档