(原创)基于CountDownTimer封装一个倒计时工具类

前言

安卓的计时有很多种实现方式,今天自己封装一个,方便以后使用
今天这个是基于CountDownTimer进行的一个封装
代码也不复杂,直接贴上

代码和使用

public class CusCountDownUtil {

    /**
     * 倒计时结束的回调接口
     */
    public interface FinishDelegate {
        void onFinish();
    }

    /**
     * 定期回调的接口
     */
    public interface TickDelegate {
        void onTick(long pMillisUntilFinished);
    }

    private final static long ONE_SECOND = 1000;

    /**
     * 总倒计时时间
     */
    private long mMillisInFuture = 0;

    /**
     * 定期回调的时间 必须大于0 否则会出现ANR
     */
    private long mCountDownInterval;

    /**
     * 倒计时结束的回调
     */
    private FinishDelegate mFinishDelegate;

    /**
     * 定期回调
     */
    private TickDelegate mTickDelegate;
    private MyCountDownTimer mCountDownTimer;

    /**
     * 获取 CountDownTimerUtils
     * @return CountDownTimerUtils
     */
    public static CusCountDownUtil getCountDownTimer() {
        return new CusCountDownUtil();
    }

    /**
     * 设置定期回调的时间 调用{@link #setTickDelegate(TickDelegate)}
     * @param pCountDownInterval 定期回调的时间 必须大于0
     * @return CountDownTimerUtils
     */
    public CusCountDownUtil setCountDownInterval(long pCountDownInterval) {
        this.mCountDownInterval=pCountDownInterval;
        return this;
    }

    /**
     * 设置倒计时结束的回调
     * @param pFinishDelegate 倒计时结束的回调接口
     * @return CountDownTimerUtils
     */
    public CusCountDownUtil setFinishDelegate(FinishDelegate pFinishDelegate) {
        this.mFinishDelegate=pFinishDelegate;
        return this;
    }

    /**
     * 设置总倒计时时间
     * @param pMillisInFuture 总倒计时时间
     * @return CountDownTimerUtils
     */
    public CusCountDownUtil setMillisInFuture(long pMillisInFuture) {
        this.mMillisInFuture=pMillisInFuture;
        return this;
    }

    /**
     * 设置定期回调
     * @param pTickDelegate 定期回调接口
     * @return CountDownTimerUtils
     */
    public CusCountDownUtil setTickDelegate(TickDelegate pTickDelegate) {
        this.mTickDelegate=pTickDelegate;
        return this;
    }

    public void create() {
        if (mCountDownTimer != null) {
            mCountDownTimer.cancel();
            mCountDownTimer = null;
        }
        if (mCountDownInterval <= 0) {
            mCountDownInterval = mMillisInFuture + ONE_SECOND;
        }
        mCountDownTimer = new MyCountDownTimer(mMillisInFuture, mCountDownInterval);
        mCountDownTimer.setTickDelegate(mTickDelegate);
        mCountDownTimer.setFinishDelegate(mFinishDelegate);
    }

    /**
     * 开始倒计时
     */
    public void start() {
        if (mCountDownTimer == null) {
            create();
        }
        mCountDownTimer.start();
    }

    /**
     * 取消倒计时
     */
    public void cancel() {
        if (mCountDownTimer != null) {
            mCountDownTimer.cancel();
        }
    }

    private static class MyCountDownTimer extends CountDownTimer {
        private FinishDelegate mFinishDelegate;
        private TickDelegate mTickDelegate;
        public MyCountDownTimer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }
        @Override
        public void onTick(long millisUntilFinished) {
            if (mTickDelegate != null) {
                mTickDelegate.onTick(millisUntilFinished);
            }
        }
        @Override
        public void onFinish() {
            if (mFinishDelegate != null) {
                mFinishDelegate.onFinish();
            }
        }
        void setFinishDelegate(FinishDelegate pFinishDelegate) {
            this.mFinishDelegate=pFinishDelegate;
        }
        void setTickDelegate(TickDelegate pTickDelegate) {
            this.mTickDelegate=pTickDelegate;
        }
    }
}

大部分的方法作用都写在源码里面了
使用起来也很简单:

        CusCountDownUtil countDownTimer = CusCountDownUtil.getCountDownTimer();
        countDownTimer.setMillisInFuture(endTimes) // 倒计时总时间
                .setCountDownInterval(1000) // 间隔监听onTick
                .setTickDelegate(new CusCountDownUtil.TickDelegate() {
                    @Override
                    public void onTick(long pMillisUntilFinished) {
                        if (protectTimes == 0) {
                            canRobHeadlines();
                        } else if (protectTimes > 0) {
                            //未过保护期,显示倒计时
                            mDataBinding.tvRobTime.setText(protectTimes + "s");
                            mDataBinding.tvRobTime.setBackgroundResource(0);
                            mDataBinding.tvRobTime.setOnClickListener(null);
                        }
                        protectTimes--;
                    }
                }).setFinishDelegate(new CusCountDownUtil.FinishDelegate() {
                    @Override
                    public void onFinish() {
                        doDestroy();
                    }
                });
        countDownTimer.start();

记得最后要回收资源:

        if (countDownTimer!=null){
            countDownTimer.cancel();
        }

资料分享

最后分享一下其他的倒计时实现方式:
Android实现倒计时的几种方案汇总

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值