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<>();
}