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