Android 心跳工具类

前言:可用于定时轮询和延时轮询任务的场景,比如心跳轮询到服务器主动获取消息,采用线程池实现,可以开启多个任务。

/**
 * desc:优点除了线程池的特性以外,可以实现循环或延迟任务
 *
 * @author Zach
 * create 2024/7/3 10:32
 */
public class HeartBeatTools {
    private static final String TAG = HeartBeatTools.class.getSimpleName();
    private ScheduledExecutorService mScheduledExecutorService;
    private HashMap<String, Future> map;

    /**
     * 单例设计模式(饿汉式)
     * 单例首先私有化构造方法,然后饿汉式一开始就开始创建,并提供get方法
     */
    private static HeartBeatTools mInstance = new HeartBeatTools();

    public static HeartBeatTools getInstance() {
        return mInstance;
    }

    /**
     * 初始化
     */
    private HeartBeatTools() {
        // 线程池大小5
        mScheduledExecutorService = Executors.newScheduledThreadPool(5);
        map = new HashMap<>();
    }

    /**
     * 获取任务总数
     */
    public int getTaskNum() {
        return map == null ? 0 : map.size();
    }

    /**
     * @param task         开始一个心跳任务
     * @param initialDelay 初始延迟时间
     * @param period       多长时间执行一次
     * @param unit         单位 TimeUnit.SECONDS,TimeUnit.MILLISECONDS
     */
    public void startTheBeatAction(HeartBeatTask task, long initialDelay, long period, TimeUnit unit) {
        if (map.containsKey(task.getTaskName())) {
            MyLog.d(TAG, "心跳正在进行,无需重复添加");
            return;
        }
        Future future = mScheduledExecutorService.scheduleAtFixedRate(task, initialDelay, period, unit);
        map.put(task.getTaskName(), future);

    }

    /**
     * @param task 关闭指定的心跳任务
     */
    public void shutDownTheBeatAction(HeartBeatTask task) {
        Future future = map.get(task.getTaskName());
        // 传入true会中断线程停止任务
        if (future != null) {
            future.cancel(true);
            map.remove(task.getTaskName());
        } else {
            MyLog.d(TAG, "你指定的这个心跳任务已经不存在,无需关闭");
        }
    }

    /**
     * @param task      开启延时任务
     * @param delayTime 延时时间
     */
    public void startDelayedAction(HeartBeatTask task, int delayTime) {
        mScheduledExecutorService.schedule(task, delayTime, TimeUnit.MILLISECONDS);
    }

    /**
     * 销毁所有变量
     */
    public void shutDownAll() {
        if (mScheduledExecutorService != null) {
            // 强制关闭
            mScheduledExecutorService.shutdownNow();
            mScheduledExecutorService = null;
        }
        map.clear();
        map = null;
    }
}
/**
 * desc:开启任务
 *
 * @author Zach
 * create 2024/7/3 10:32
 */
public class HeartBeatTask implements Runnable {

    private String taskName;

    public HeartBeatTask(String taskName) {
//        this.taskName = "beatTask_" + System.nanoTime();
        this.taskName = taskName;
    }

    String getTaskName() {
        return taskName;
    }

    @Override
    public void run() {
        switch (taskName) {
            case Constants.ACTION_LOGIN:
                HttpReqFunManager.getInstance().requestLogin();
                break;
            default:
                break;
        }
    }
}

调用开启和结束

HeartBeatTools.getInstance().startTheBeatAction(new HeartBeatTask(Constants.ACTION_LOGIN)
                , 0, 5, TimeUnit.SECONDS);
                
HeartBeatTools.getInstance().shutDownAll();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值