執行冗長的流程,而不是沒有響應的應用程式
在某些情況下,你需要在 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()
分成幾個函式,在其他地方顯示進度,調整迭代過程以適應物件列表的更改過程等等。