执行冗长的流程,而不是没有响应的应用程序

在某些情况下,你需要在 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() 分成几个函数,在其他地方显示进度,调整迭代过程以适应对象列表的更改过程等等。