zoukankan      html  css  js  c++  java
  • Android项目实战(六十二):AOP实现防止重复点击

    AOP即面向切面编程,相关知识可以自己先了解。

    这里使用AOP来实现防止按钮重复点击的需求

    一、项目配置

    1、根目录build.gradle文件

    buildscript {
    
        dependencies {
            ...
            classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
        }
    }

    2、app目录下进出3处配置

    (1)、

    apply plugin: 'android-aspectjx'

    (2)、

    android {
        aspectjx {
            include 'com.mxqx.xqxtest'  // 这里为项目包名
        }
    }

    (3)、

        implementation 'org.aspectj:aspectjrt:1.9.6'

    二、使用

    (1)、自定义注解类(这里可以自行学习下注解的相关知识)

    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)、切面类

    @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注解的方法便会进去切面方法进行重复点击的相关判断

            // 点击事件
            tvToCir.setOnClickListener(new View.OnClickListener() {
                @SingleClick
                @Override
                public void onClick(View view) {
                    // 长方形变圆形
                    Log.i("xqxinfo","长方形变圆形");
                    rectToCir();
                }
            });
        @SingleClick
        public void showLog(String name){
            Log.i("xqxinfo","name->"+name);
        }

    由于自定义注解SingleClick的默认值1000,当某些地方想更改点击间隔的时候可以写成@SingleClick(5000),即value赋值5000

        @SingleClick(5000)
        public void showLog(String name){
            Log.i("xqxinfo","name->"+name);
        }
    
    

    作者:听着music睡

    出处:http://www.cnblogs.com/xqxacm/

    Android交流群:38197636

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    题目1449:确定比赛名次
    题目1005:Graduate Admission
    HDU 4786 Fibonacci Tree
    FZU Problem 2136 取糖果
    iOS 递归锁
    iOS xcode问题集结
    iOS 芝麻认证开发(跳转本地的支付宝进行认证开发)
    iOS导出ipa包时四个选项的意义
    两排按钮循环
    Masony 常用方法
  • 原文地址:https://www.cnblogs.com/xqxacm/p/15792739.html
Copyright © 2011-2022 走看看