节流工具,避免操作太频繁

ThrottleUtil

用于保证某个操作在一定时间内只执行一次的工具。

java 复制代码
package com.cashpro.kash.lending.loan.utils;

/**
 * <pre>
 * Created by zhuguohui
 * Date: 2024/6/26
 * Time: 13:43
 * Desc:用于节流执行任务,限制任务执行的频次
 * </pre>
 */

import android.os.Handler;

import java.util.HashMap;
import java.util.Map;

public class ThrottleUtil {

    private static final Handler HANDLER = new Handler();


    private static Map<String, Long> lastExecutionTimeMap = new HashMap<>();
    private static Map<String, Runnable> runnableMap = new HashMap<>();

    /**
     * 执行节流操作,确保操作在连续触发后至少等待指定的时间间隔再执行。
     *
     * @param opName         要执行操作的名称
     * @param intervalMillis 时间间隔,以毫秒为单位
     * @param runnable       要执行的操作
     */
    public static synchronized void executeThrottled(String opName, long intervalMillis, Runnable runnable) {
        long currentTime = System.currentTimeMillis();
        long lastExecutionTime = 0;
        if (lastExecutionTimeMap.containsKey(opName)) {
            Long aLong = lastExecutionTimeMap.get(opName);
            if (aLong != null) {
                lastExecutionTime = aLong;
            }
        }


        // 如果距离上次执行已经超过指定时间间隔,则立即执行操作
        if (currentTime - lastExecutionTime >= intervalMillis) {
            runnable.run();
            lastExecutionTime = currentTime;
            lastExecutionTimeMap.put(opName, lastExecutionTime);
        } else {
            // 如果时间未到,则移除之前的Runnable并重新添加
            Runnable throttleRunnable = runnableMap.get(opName);
            if (throttleRunnable != null) {
                HANDLER.removeCallbacks(throttleRunnable);
                runnableMap.remove(opName);
            }
            throttleRunnable = () -> {
                runnable.run();
                long lastExecutionTime1 = System.currentTimeMillis();
                lastExecutionTimeMap.put(opName, lastExecutionTime1);
                runnableMap.remove(opName);
            };
            runnableMap.put(opName, throttleRunnable);
            HANDLER.postDelayed(throttleRunnable, intervalMillis - (currentTime - lastExecutionTime));
        }
    }

    // 工具类不需要实例化,所以构造器私有
    private ThrottleUtil() {
        // 阻止实例化
    }

    // 可以在Activity或Fragment的onDestroy()中调用此方法,以确保没有内存泄漏
    public static void clearCallbacks(String... opNames) {
        for (String opName : opNames) {
            Runnable runnable = runnableMap.get(opName);
            if (runnable != null) {
                HANDLER.removeCallbacks(runnable);
            }
            runnableMap.remove(opName);
        }

    }
}

使用

如下使用,其中第一个参数是一个操作名称,每个界面的操作不能重复。否则可能被其他地方取消。

按时取消

在界面销毁的时候记得移除操作

相关推荐
淼澄研学13 分钟前
基于Docker与iptables的AI智能体网络隔离实操指南
开发语言·python
杰哥哥不是个好叔叔21 分钟前
【Spring AI】Spring AI 2.0.1 新特性袭来
java·人工智能·spring
莫陌尛.26 分钟前
Java核心知识点:直接内存、CPU密集型线程池、并行流对比文档
java·开发语言
Zane199431 分钟前
自定义异常该继承 Exception 还是 RuntimeException,就看这一个问题
java·后端
西峰u32 分钟前
Java多线程初阶完整总结|线程、锁、volatile、等待通知、常见案例
java·开发语言·jvm
爱喝可乐的中登40 分钟前
SpringBoot 云边协同|智慧地铁 ISCS 改造实战第 10 篇:全网权限与数据隔离重构|线路‑车站‑专业三级 RBAC、边缘数据权限下沉
java·spring boot·重构
夜雨声烦丿1 小时前
从需求到页面:日期计算器应用的 ArkTS 原生实现
开发语言·javascript·华为·harmonyos
落魄实习生1 小时前
Spring AI Alibaba入门-生态集成
java·人工智能·spring
蜡台1 小时前
Jetpack Compose 稳定性、重组优化(Stable / @NonRestartableComposable)
android·kotlin·compose·jepack
重生之我是Java开发战士1 小时前
【Java EE】认识Linux与项目部署
java·linux·java-ee