防抖含义:在指定延时时间内,不管调用了多少次方法,只会执行最后一次调用的动作去执行方法。
举例:设定延时为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() {@Overridepublic 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();}