我们开发中经常需要用到计时器,如果我们开了很多定时器的话,就会消耗很多内存。而且也是每次都得写定时器的重复代码。这样不好,那么我们可以写一个全局统一的计时器管理工具。
全局计时管理器代码如下:
具体有两个类:
package com.qingmo.matchgo.other.time;
import java.util.ArrayList;
/**
* ================================================
* 作 者:轻风
* 版 本:1.0
* 创建日期:2017/8/4 16:29
* 描 述:订阅计时任务管理器,(如果有订阅服务过来,而定时器没有工作时,那么直接启动计时任务)
* Q Q:2319118797
* ================================================
*/
public class SubscribeTimeManage {
private ArrayList<OnTimeListener> subscribeList=new ArrayList<>();
private static class SingletonHolder
{
public final static SubscribeTimeManage instance = new SubscribeTimeManage();
}
public static SubscribeTimeManage getInstance()
{
//使用内部类的形式,需要用到时才会java虚拟机才回去创建内部类对象
return SingletonHolder.instance;
}
public ArrayList<OnTimeListener> getSubscribeList(){
return subscribeList;
}
/**
* 订阅
* @param onTimeListener
*/
public void register(OnTimeListener onTimeListener){
if(subscribeList.contains(onTimeListener)){
//已经订阅了,不做处理
}else {
//未订阅过
//订阅
subscribeList.add(onTimeListener);
//检查定时器是否在运行
if(!TimeManage.getInstance().isRuning()){
//如果定时器没有在运行,启动定时器
TimeManage.getInstance().startTime();
}
}
}
/**
* 取消订阅
* @param onTimeListener
*/
public void unregister(OnTimeListener onTimeListener){
if(subscribeList.contains(onTimeListener)){
//已经订阅
//取消订阅
subscribeList.remove(onTimeListener);
}else {
//未订阅过
//不做处理
}
}
public interface OnTimeListener{
//每秒调用一次
void oneSecond();
}
}
package com.qingmo.matchgo.other.time;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
/**
* ================================================
* 作 者:轻风
* 版 本:1.0
* 创建日期:2017/8/4 14:56
* 描 述:全局计时管理器。(全局只需要一个计时器,需要计时的地方在SubscribeTimeManage上订阅)
* Q Q:2319118797
* ================================================
*/
public class TimeManage {
//计时器是否在运行
private boolean isRuning=false;
private final long DELAY=1000;//一秒钟走一次
private long stratTime;//处理任务开始时的系统时间
private long endTime;////任务处理完的系统时间
//计时,一秒钟走一次
Handler handleProgress = new Handler() {
public void handleMessage(Message msg) {
stratTime= System.currentTimeMillis();
//处理任务
processSubscribe();
endTime= System.currentTimeMillis();
if(isRuning) {
//计算出做任务耗的时间,然后调整一下DELAY时间(真正的DELAY=原DELAY-处理任务耗的时间)
handleProgress.sendEmptyMessageDelayed(0, DELAY-(endTime-stratTime));
}
}
};
private static class SingletonHolder
{
public final static TimeManage instance = new TimeManage();
}
public static TimeManage getInstance()
{
//使用内部类的形式,需要用到时才会java虚拟机才回去创建内部类对象
return SingletonHolder.instance;
}
/**
* 返回计时器运行状态
* @return
*/
public boolean isRuning(){
return isRuning;
}
/**
* 开始计时
*/
public void startTime(){
if(!isRuning) {
isRuning=true;
handleProgress.sendEmptyMessage(0);
Log.i("TimeManage","定时器启动");
}
}
/**
* 处理任务
*/
private void processSubscribe(){
if(SubscribeTimeManage.getInstance().getSubscribeList().size()==0){
//当没有订阅者时,停止定时器
isRuning=false;
Log.i("TimeManage","没有订阅者,定时器自动关闭");
}else {
//当有订阅者时
//给所有的订阅者回调一次
for (int i = 0; i < SubscribeTimeManage.getInstance().getSubscribeList().size(); i++) {
SubscribeTimeManage.getInstance().getSubscribeList().get(i).oneSecond();
}
}
}
}
具体使用方法:
订阅计时
SubscribeTimeManage.getInstance().register(onTimeListener);
取消计时
SubscribeTimeManage.getInstance().unregister(onTimeListener);
定时监听
SubscribeTimeManage.OnTimeListener onTimeListener=new SubscribeTimeManage.OnTimeListener() {
@Override
public void oneSecond() {
//每秒会调用一次
//TODO 可以在这里写具体每秒所需要做的事
}
};
网友评论