相信我们遇到过短时间内多次点击的问题,解决该问题有很多方式,这里提供一种AOP实现的方式,主要使用一下aspectj
先说一个坑,使用AOP一定记得要ReBuild项目,ReBuild项目,ReBuild项目,实在不行放大招,卸载app后再ReBuild
先引入aspectj
//在Project中
dependencies {
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'
}
//在app中
apply plugin: 'android-aspectjx' //插件
implementation 'org.aspectj:aspectjrt:1.8.+' //jar
上代码
- 定义注解,在IOC框架的时候使用过
@Target(ElementType.METHOD) // Target 放在哪个位置
@Retention(RetentionPolicy.RUNTIME)// RUNTIME 运行时 xUtils CLASS 代表编译时期 ButterKnife SOURCE 代表资源
public @interface FastClick {
}
- 核心类
@Aspect
public class FastClickAspect {
/**
* 这里是注解的全名
*/
@Pointcut("execution(@com.justin.testaop.aop.FastClick * *(..))")
public void fastClickBehavior(){
}
@Around("fastClickBehavior()")
public Object fastClick(ProceedingJoinPoint joinPoint) throws Throwable {
Log.e("TAG", "fastClick");
MethodSignature methodSignature =
(MethodSignature) joinPoint.getSignature();
//有说这个方法是获取代理对象(接口)方法的注解
FastClick fastClick = methodSignature.getMethod().getAnnotation(FastClick.class);
//有说这个方法才是获取目标方法的注解
// Method realMethod = joinPoint.getTarget().getClass().getMethod(methodSignature.getName(),
// methodSignature.getParameterTypes());
// FastClick fastClick = realMethod.getAnnotation(FastClick.class);
Log.e("fastClick",fastClick == null?"null":"notnull");
if (fastClick != null){
if (Utils.isFastClick()){
return null;
}
}
return joinPoint.proceed();
}
}
上面第一个方法,有说是获取代理对象(接口)方法的注解,说第二个方法才是获取目标对象方法的,我目前使用第一个方法也能获取到目标对象方法上的注解,所以目前没遇到无法获取的情况.
- 其中Utils
public class Utils {
private static long lastTime = 0;
private static final long MINI_TIME = 1000;
public static boolean isFastClick(){
boolean flag = false;
long currentTimeMillis = System.currentTimeMillis();
if (currentTimeMillis-lastTime<MINI_TIME){
flag = true;
}
lastTime = currentTimeMillis;
return flag;
}
}
- 使用
@FastClick
@Override
public void onClick(View v) {
Toast.makeText(this, "not fast", Toast.LENGTH_SHORT).show();
}
其实对AOP我们并不陌生,动态代理也是AOP的一种实现,可以参考文章代理模式