从工作里爱了生命,就是通彻了生命最深的秘密。——纪伯伦
前段时间写了js
防抖,今天朋友(无中生友)找我要java
版的
来!
代码语言:javascript复制package com.ruben.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import java.util.Timer;
import java.util.TimerTask;
@Aspect
public class HandShakeAop {
boolean antiShakeFlag = false;
@Pointcut("execution(* com.ruben...*.onClick(..))||execution(* android.view..*.OnClickListener.onClick(..))")
public void onClickPointcut() {
}
@Around("onClickPointcut()")
public Object around(ProceedingJoinPoint joinPoint) {
if (antiShakeFlag) {
return null;
}
try {
Object proceed = joinPoint.proceed();
antiShakeFlag = true;
new Timer().schedule(new TimerTask() {
public void run() {
antiShakeFlag = false;
}
}, 5000);
return proceed;
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return null;
}
}
这是写在AOP
里的实战,如果要精简版,就是这样
package com.ruben;
import java.util.Timer;
import java.util.TimerTask;
/**
* @ClassName: HandShakeDemo
* @Date: 2020/9/25 19:49
* @Description:
*/
public class HandShakeDemo {
public static void main(String[] args) {
for (int i = 1; i <= 10; i ) {
System.out.println("循环第" i "次");
ruben();
}
}
/**
* 标志位需要定义在函数外边
*/
public static boolean antiShakeFlag = false;
/**
* 执行的函数
*/
public static void ruben() {
if (antiShakeFlag) {
return;
}
try {
// 执行逻辑
System.out.println("ruben执行了");
// 逻辑执行完毕后置为空
antiShakeFlag = true;
new Timer().schedule(new TimerTask() {
public void run() {
antiShakeFlag = false;
}
}, 5000);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
输出结果可以看到,循环正常执行,但我们的关键逻辑代码只执行了一次
无论执行多少次,在schedule()
第二个参数设置的时间(毫秒值)内都只会执行一次