MultiTimer 单一计时器 更高效 更安全

目的是使用一个定时器,但是完成多个Function的功能,并且完成时调用不同的函数。不过个人感觉参数太多,而且如果程序执行时间之和大于延迟时间,不就产生混乱了吗?

有时有一些function都有延时,并且频率都一样,

一般的做法是 一个做法: 每个function都new Tiemr,

function不多还好,一旦多了就很浪费资源了,
这个时候,O(∩_∩)O哈哈~MutiTimer出场了

MutiTimer应用环境:

  • 有多个function要延时调用
  • 所有function的调用的频率相同

MutiTimerTimer比较 之优点:

  • 更高效:用一个Timer调用所有的function
  • 传任意参数: Timer TimerComplete都可以传任意个数参数
  • 更安全:使用者 不用事件,就不需要记住 移除事件

MutiTimerTimer比较 之缺点:

  • 多个function必须频率一致,是Timer.delay 一样,不然精确度低
  • 不能记录执行了多少次
  • 启动了一个function后,这个function将不能停下,直到 指定时间之后

说了这么多,放代码上来

package cn.lite3.utils
{
	import flash.events.TimerEvent;
	import flash.utils.getTimer;
	import flash.utils.Timer;

	/**
	 * <a href="http://www.lite3.cn">www.lite3.cn</a>
	 * lite3@qq.com
	 * @author lite3
	 */
	public class MultiTimer 
	{

		private var _delay:Number;
		private var queue:Array = []; // 对象池
		private var timer:Timer;

		/**
		 * 构造函数
		 * @param	delay	<b>	int	</b> Timer的间隔 单位:ms
		 */
		public function MultiTimer(delay:Number) 
		{
			this.delay = delay;
		}

		/** 频率 */
		public function get delay():Number { return _delay; }
		public function set delay(value:Number):void 
		{
			if (isNaN(value)) value = 0;
			if (value < 0) value = 0;
			if (_delay != value)
			{
				_delay = value;
				if (timer) timer.delay = value;
			}
		}

		/**
		 * 添加一个时间函数
		 * 
		 * @param	time		<b>	int		</b> 运行的时间,单位:ms
		 * @param	completeFunc<b>	Function</b> 结束时函数
		 * @param	completeArgs<b>	Array	</b> 结束时函数的参数
		 * @param	completeThis<b>	Object	</b> 结束时函数的this对象
		 * @param	timerFunc	<b>	Function</b> timer时函数
		 * @param	timerArgs	<b>	Array	</b> timer时函数的参数
		 * @param	timerThis	<b>	Object	</b> timer时函数的this 对象
		 */
		public function addTimer(time:int,completeFunc:Function = null,completeArgs:Array = null,completeThis:Object=null,timerFunc:Function = null,timerArgs:Array = null,timerThis:Object = null):void
		{

			if (!completeFunc && !timerFunc) return;

			// 时间为0,则马上调用回调函数
			if (time <= 0)
			{
				if (completeFunc)
					completeFunc.apply(completeThis,completeArgs);
				return;
			}

			// 添加事件到队里
			var vo:Vo = new Vo( getTimer() + time,completeFunc,completeArgs,completeThis,timerFunc,timerArgs,timerThis);

			addToQueue(vo);

			// 惰性启动
			if (!timer) timer = new Timer(_delay);

			// 运行timer
			if (!timer.running)
			{
				timer.addEventListener(TimerEvent.TIMER,timerHandler);
				timer.start();
			}
		}

		/**
		 * @private	添加一个事件到 有序队列(按time 从大到小排列)
		 * @private 
		 * @param	vo
		 */
		private function addToQueue(vo:Vo):void
		{
			var time:int = vo.time;
			var index:int = 0;
			for each(var tem:Vo in queue)
			{
				if (tem.time <= time) break;

				index++;
			}
			for (var i:int = queue.length; i > index; i--)
			{
				queue[i] = queue[i - 1];
			}

			queue[index] = vo;
		}

		/**
		 * @private	执行循环
		 * @param	e
		 */
		private function timerHandler(e:TimerEvent):void 
		{
			var currTime:int = getTimer();
			for (var i:int = queue.length -1; i >= 0; i--)
			{
				var vo:Vo = queue[i] as Vo;

				// Timer 事件
				if (vo.timerFunc) 
					vo.timerFunc.apply(vo.timerThis,vo.timerArgs);

				// TimerComplete 事件
				if (vo.time <= currTime)
				{
					queue.pop();
					if (vo.completeFunc)
						vo.completeFunc.apply(vo.completeThis,vo.completeArgs);
				}
			}

			if (queue.length <= 0)
			{
				timer.stop();
				timer.removeEventListener(TimerEvent.TIMER,timerHandler);
			}
		}
	}
}

// 存放 相关信息
class Vo
{
	public var time:int
	public var completeFunc:Function;
	public var completeArgs:Array;
	public var completeThis:Object;
	public var timerFunc:Function;
	public var timerArgs:Array;
	public var timerThis:Object;

	public function Vo( time:int,completeFunc:Function,completeArgs:Array,completeThis:Object,timerFunc:Function,timerArgs:Array,timerThis:Object):void
	{
		this.time = time;
		this.completeFunc = completeFunc;
		this.completeArgs = completeArgs;
		this.completeThis = completeThis
		this.timerFunc	  = timerFunc;
		this.timerArgs	  = timerArgs;
		this.timerThis	  = timerThis;
	}
}
MultiTimer 用法:

package 
{
	import cn.lite3.utils.MultiTimer;
	import flash.display.Sprite;
	import flash.utils.getTimer;

	/**
	 * www.lite3.cn
	 * lite3@qq.com
	 * @author lite3
	 */
	public class MultiTimerExample extends Sprite
	{

		private var beginTime:int;
		private var multiTimer:MultiTimer;

		public function MultiTimerExample() 
		{
			beginTime = getTimer();

			// 要先实例化才能用,参数为 精度,相当于 new Timer(t)的t 参数
			multiTimer = new MultiTimer(100);

			/**
			 * 添加一个事件,其实就是一个函数,这个函数会以回调的方式调用
			 * 支持 传入参数
			 */ 
			multiTimer.addTimer(1000,completeHandler,["function1",1000],null,timerHandler,1000]);
			multiTimer.addTimer(2000,["function2",2000]);
			multiTimer.addTimer(3000,["function3",3000]);

		}

		private function timerHandler(name:String,time:int):void
		{
			trace("timerHandler!这是:",name,"/t持续时间:",time);
		}

		private function completeHandler(name:String,time:int):void
		{
			trace("completeHandler!这是:",time,"/t实际用时:",getTimer() -beginTime);
			if ("function3" == name)
			{
				time = getTimer();
				// 不同的时间添加事件
				multiTimer.addTimer(1000,["重启后的function3",1000]);
			}
		}

	}

}
 

运行后,您会看到类似下面的输出

timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function1 持续时间: 1000
completeHandler!这是: function1 持续时间: 1000 实际用时: 1102
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
timerHandler!这是: function2 持续时间: 2000
completeHandler!这是: function3 持续时间: 3000 实际用时: 3100
timerHandler!这是: 重启后的function3 持续时间: 1000
timerHandler!这是: 重启后的function3 持续时间: 1000
timerHandler!这是: 重启后的function3 持续时间: 1000
timerHandler!这是: 重启后的function3 持续时间: 1000
timerHandler!这是: 重启后的function3 持续时间: 1000
timerHandler!这是: 重启后的function3 持续时间: 1000

转载自:http://www.lite3.cn/

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...