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