android 定时器

本文介绍了在Android中实现一个特殊定时器的需求,该定时器即使在页面销毁后仍能继续计时,并在用户再次进入页面时能正确显示剩余时间。需求包括:页面离开后再返回,定时器不会重新计时;支持区分不同账号计时。文章提供了三种实现方式,包括全局使用一个计时器、利用ArrayList保存计时器和使用CountDownTimer。还给出了接口定义、部分代码示例和调用方法。
摘要由CSDN通过智能技术生成

android 定时器 (奇葩需求)

先说说这个定时器滴需求
  • 定时(这个就是废话了)
  • 当页面有定时器时,不管是否是destory了,只要时间没到,当再次进入这个页面时,不能重新计时。比如 A 进入 B 页面 ,在B页面开启定时器(假设60s)后, 回到了A页面 ,10秒后再次进入B ,这时,B页面显示的倒计时为50s(漂亮滴产品小姐姐想出来的需求,汝等屌丝也只能奋力实现啦。。。)。
  • 另外一点,貌似是还需要区分账号,不同滴账号分别计时(只要把上面的实现了,这个就比较好做了,后面会讲到思路)
思路

目前一共有三种实现方式(区别在于计时器的实现方式不同),我实现了前面两种方式,第三种的话,就靠大家自己实现了。而且我也封装了一下,只需要改变实例化的对象,就可以在两种计时方式中随意切换了。

1、全局使用一个计时器,将页面的key与时间保存在一个map中,通过计时器去回调(后面会讲到实例代码)
2、利用一个全局的arraylist,将页面的key与计时器保存在一个map中,在将map放入list里面。(计时器通过实现CountDownTimer来做滴)
3、 将页面的key与开始时间保存在一个map中,然后页面自己持有一个计时器,自己处理。

代码实现
第一种方式

先看接口类(ITimer)

public interface ITimer {
   

    /**
     * 绑定回调
     * @param name 页面的key
     * @param onNotifyTimeCallback 回调
     */
    void bind(String name, OnNotifyTimeCallback onNotifyTimeCallback);

    /**
     * 任务开始的时候调用
     * 默认情况下返回59~0
     * @param name 页面的key
     * @param onNotifyTimeCallback 回调
     */
    void start(String name, OnNotifyTimeCallback onNotifyTimeCallback);

    /**
     * 任务开始的时候调用
     * 默认情况下返回59~0
     * @param name 页面的key
     * @param onNotifyTimeCallback 回调
     * @param millisInFuture 总时间
     * @param countDownInterval 间隔时间
     */
    void start(String name, OnNotifyTimeCallback onNotifyTimeCallback, long millisInFuture, long countDownInterval);

    /**
     * 移除绑定
     * @param name 页面的key
     */
    void unbind(String name);
}



这个是实现类(TimerHelper )
``java
public class TimerHelper implements ITimer {
   

    //保存页面时间
    private Map<String, Long> mMap;
    private Timer mTimer;
    private ArrayList<Map<String, OnNotifyTimeCallback>> mCallbacks = new ArrayList<>();

    private static TimerHelper timerHelper;

    //默认时间
    private static final long MILLIS_IN_FUTURE = 60 * 1000;
    private static final long COUNT_DOWN_INTERVAL = 1000;

    private long millisInFuture;
    private long countDownInterval;

    /**
     * 定时timer
     */
    private TimerTask mTimerTask;

    /**
     * TimerHelper 单例
     * @return
     */
    public static TimerHelper getInstance() {
        if (timerHelper == null) {
            synchronized (TimerHelper.class) {
                if (timerHelper == null) {
                    timerHelper = new TimerHelper();
                }
            }
        }
        return timerHelper;
    }

    private TimerHelper() {
        mMap = new HashMap<>();
    }

    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值