美文网首页读书点点
Android 计时器统一管理

Android 计时器统一管理

作者: 懒人改变世界_ | 来源:发表于2019-04-07 17:31 被阅读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 可以在这里写具体每秒所需要做的事
            }
        };
    

    相关文章

      网友评论

        本文标题:Android 计时器统一管理

        本文链接:https://www.haomeiwen.com/subject/njisiqtx.html