AS3.0完全相容了AS2.0的時間函式,所以用習慣了AS2.0的朋友不用擔心會不習慣。這些時間函式包括:
1. setInterval 和 clearInterval
這兩個不用我介紹的吧?呵呵
2. setTimeout 和 clearTimeout
這個不知道你用過沒?很實用的一個功能,但不知道為什麼沒有出現在AS2.0的幫助文件中。在AS2.0中是實實在在存在的,功能是隻執行一次時間函式。
3. getTimer
這個也應該家喻戶曉的。
下面我想介紹下AS3.0新推出的控制時間的類,就是Timer類(flash.utils.Timer)
這個類的應用還是比較簡單的,我們看下面一段程式碼:
var t:Timer = new Timer(1000, 5); //定義一個間隔1000毫秒,執行5次的Timer。如果沒有引數5就是無限次呼叫直到執行stop()方法;
function onTick(event:TimerEvent) {
if (event.target.currentCount == 3) t.stop();
trace(“onTick”);
}
t.addEventListener(TimerEvent.TIMER, onTick); //每隔1000毫秒呼叫一次
function onFinish(event:TimerEvent) {
trace(“onFinish”);
}
t.addEventListener(TimerEvent.TIMER_COMPLETE, onFinish); //執行結束後呼叫
t.start(); //開始計時
結構相對還是比較清楚的,我這裡做幾點說明:
1. Timer類的事件只有這兩種TIMER和TIMER_COMPLETE(繼承的不算,下同)
2. 在函式體內,要呼叫Timer類的方法或屬性,需要用event.target(指向Timer例項),而不像其他事件直接用event就可以,這個是有區別的(參見本例onTick函式體)。
下面討論個新手不需要理會的問題:
AS3.0為什麼不推薦沿用原來的時間機制,而採用Timer類來實現時間間隔?Timer類的優勢是什麼?
這個問題有點難回答,本人經過多次測試,從執行效率上並沒有發現Timer類有任何優勢。方便性上也沒發現有什麼劃時代進步,傳參反而還麻煩了些。那麼Timer類的優勢到底是什麼呢?我得出的結論是:毫無優勢…再囧一個…
但我們從程式碼的習慣性上面來比較:
1. setInterval
如果執行了setInterval,而沒有執行clearInterval,那麼該偵聽器物件永遠不會被回收。但是這個錯誤一般不會犯,因為不終止的話,setInterval會一直執行下去。
2. setTimeout
如果執行了setTimeout,而沒有執行clearTimeout,那麼該偵聽器物件永遠不會被回收!
這個才是致命傷!因為setTimeout只執行一次時間函式,很少有人會專門寫clearTimeout語句的。事實上,本人沒做研究之前,一直以為clearTimeout只是為了提前終止setTimeout用的,根本不知道只有這樣才能回收偵聽器。那麼如果在一個應用程式中大量使用setTimeout而不清理,倒確實會對效能產生影響。
3. Timer
Timer類再兩種情況下會正常回收偵聽器:
(1) 定義一個有限執行次數的Timer,執行次數到了之後正常回收
(2) 使用Timer.stop();方法,立即回收偵聽器。
所以,我只能理解為,Timer的優勢是比較容易養成良好的回收偵聽器習慣…