读书点点

Android 计时器统一管理

2019-04-07  本文已影响0人  懒人改变世界_

我们开发中经常需要用到计时器,如果我们开了很多定时器的话,就会消耗很多内存。而且也是每次都得写定时器的重复代码。这样不好,那么我们可以写一个全局统一的计时器管理工具。

全局计时管理器代码如下:

具体有两个类:

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 可以在这里写具体每秒所需要做的事
        }
    };
上一篇下一篇

猜你喜欢

热点阅读