implementing debounce in Java

前端 未结 8 684
心在旅途
心在旅途 2020-11-30 04:09

For some code I\'m writing I could use a nice general implementation of debounce in Java.

public interface Callback {
  public void call(Object          


        
8条回答
  •  生来不讨喜
    2020-11-30 04:36

    Here is my working implementation:

    Execution Callback:

    public interface cbDebounce {
    
    void execute();
    
    }
    

    Debouncer:

    public class Debouncer {
    
    private Timer timer;
    private ConcurrentHashMap delayedTaskMap;
    
    public Debouncer() {
        this.timer = new Timer(true); //run as daemon
        this.delayedTaskMap = new ConcurrentHashMap<>();
    }
    
    public void debounce(final String key, final cbDebounce debounceCallback, final long delay) {
        if (key == null || key.isEmpty() || key.trim().length() < 1 || delay < 0) return;
    
        cancelPreviousTasks(); //if any
    
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                debounceCallback.execute();
                cancelPreviousTasks();
                delayedTaskMap.clear();
                if (timer != null) timer.cancel();
            }
        };
    
        scheduleNewTask(key, timerTask, delay);
    }
    
    private void cancelPreviousTasks() {
        if (delayedTaskMap == null) return;
    
        if (!delayedTaskMap.isEmpty()) delayedTaskMap
                .forEachEntry(1000, entry -> entry.getValue().cancel());
    
        delayedTaskMap.clear();
    }
    
    private void scheduleNewTask(String key, TimerTask timerTask, long delay) {
        if (key == null || key.isEmpty() || key.trim().length() < 1 || timerTask == null || delay < 0) return;
    
        if (delayedTaskMap.containsKey(key)) return;
    
        timer.schedule(timerTask, delay);
    
        delayedTaskMap.put(key, timerTask);
    }
    

    }

    Main (to test)

    public class Main {
    
    private static Debouncer debouncer;
    
    public static void main(String[] args) throws IOException, InterruptedException {
        debouncer = new Debouncer();
        search("H");
        search("HE");
        search("HEL");
        System.out.println("Waiting for user to finish typing");
        Thread.sleep(2000);
        search("HELL");
        search("HELLO");
    }
    
    private static void search(String searchPhrase) {
        System.out.println("Search for: " + searchPhrase);
        cbDebounce debounceCallback = () -> System.out.println("Now Executing search for: "+searchPhrase);
        debouncer.debounce(searchPhrase, debounceCallback, 4000); //wait 4 seconds after user's last keystroke
    }
    
    }
    

    Output

    • Search for: H
    • Search for: HE
    • Search for: HEL
    • Waiting for user to finish typing
    • Search for: HELL
    • Search for: HELLO
    • Now Executing search for: HELLO

提交回复
热议问题