防抖含义:在指定延时时间内,不管调用了多少次方法,只会执行最后一次调用的动作去执行方法。
举例:设定延时为5秒,调用防抖方法后,5秒内没有重复调用则会执行动作,5秒内有重复调用则会继续再延时等待五秒,直到5秒范围内没有调用再去执行方法。
1.核心工具类
package com.utils;
import java.util.Timer;
import java.util.TimerTask;
/**
* 防抖
*
* @author 刘铁丝
* @since 1.0
*/
public class DebounceTask {
/**
* 防抖实现关键类
*/
private Timer timer;
/**
* 防抖时间:根据业务评估
*/
private Long delay;
/**
* 开启线程执行任务
*/
private Runnable runnable;
public DebounceTask(Runnable runnable, Long delay) {
this.runnable = runnable;
this.delay = delay;
}
/**
* @param runnable 要执行的任务
* @param delay 执行时间
* @return 初始化 DebounceTask 对象
*/
public static DebounceTask build(Runnable runnable, Long delay) {
return new DebounceTask(runnable, delay);
}
/**
* Timer类执行:cancel()-->取消操作;schedule()-->执行操作
*/
public void timerRun() {
//如果有任务,则取消不执行(防抖实现的关键)
if (timer != null) {
timer.cancel();
}
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//把 timer 设置为空,这样下次判断它就不会执行了
timer = null;
//执行 runnable 中的 run()方法
runnable.run();
}
}, delay);
}
}
2.调用方式
实现五秒内不管调用多少次debounceTask()
方法 ,只会执行一次 System.out.println(">>> TODO something ");
private static DebounceTask debounceTask = null;
public void debounceTask() {
if (debounceTask == null) {
debounceTask = DebounceTask.build(() -> {
System.out.println(">>> 防抖方法开始执行:" + System.currentTimeMillis());
// TODO
System.out.println(">>> TODO something ");
}, 5000L);
}
debounceTask.timerRun();
}