執行冗長的流程,而不是沒有響應的應用程式

在某些情況下,你需要在 Flash 應用程式中計算非常大的內容,同時不會中斷使用者的體驗。為此,你需要將冗長的過程設計為多步過程,並在迭代之間儲存狀態。例如,你需要對許多內部物件執行後臺更新,但如果你希望使用簡單的 for each (var o in objects) { o.update(); } 一次更新所有內部物件,則 Flash 會短暫地(或不簡單地)對使用者無響應。因此,你需要每幀執行一次或多次更新。

private var processing:Boolean;      // are we in the middle of processing
private var lastIndex:int;           // where did we finish last time
var objects:Vector.<UpdatingObject>; // the total list of objects to update
function startProcess():Boolean {
    if (processing) return false; // already processing - please wait
    startProcessing=true;
    lastIndex=0;
    if (!hasEventListener(Event.ENTER_FRAME,iterate)) 
        addEventListener(Event.ENTER_FRAME,iterate); // enable iterating via listener
}
private function iterate(e:Event):void {
    if (!processing) return; // not processing - skip listener
    objects[lastIndex].update(); // perform a quantum of the big process
    lastIndex++; // advance in the big process
    if (lastIndex==objects.length) {
        processing=false; // finished, clear flag
    }
}

高階處理可以包括使用 getTimer() 來檢查已用時間並在時間沒有用完的情況下允許另一次迭代,如果更新太長則將 update() 分成幾個函式,在其他地方顯示進度,調整迭代過程以適應物件列表的更改過程等等。