MultiTimer 单一计时器 更高效 更安全
|
目的是使用一个定时器,但是完成多个Function的功能,并且完成时调用不同的函数。不过个人感觉参数太多,而且如果程序执行时间之和大于延迟时间,不就产生混乱了吗? 有时有一些function都有延时,并且频率都一样, 一般的做法是 一个做法: 每个function都new Tiemr, function不多还好,一旦多了就很浪费资源了, MutiTimer应用环境:
MutiTimer与Timer比较 之优点:
MutiTimer与Timer比较 之缺点:
说了这么多,放代码上来 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 转载自:http://www.lite3.cn/ (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
