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的優勢是比較容易養成良好的回收偵聽器習慣…