java函数防抖

2020-09-25

java

从工作里爱了生命,就是通彻了生命最深的秘密。——纪伯伦

前段时间写了js防抖,今天朋友(无中生友)找我要java版的

来!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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里的实战,如果要精简版,就是这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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();
}
}
}

输出结果可以看到,循环正常执行,但我们的关键逻辑代码只执行了一次

image-20200925195811721

无论执行多少次,在schedule()第二个参数设置的时间(毫秒值)内都只会执行一次