我有一个漫长而忙碌的for循环,它应该迭代地在舞台上添加元素。由于执行整个循环需要几秒钟(i = 1:N),我只想在每个循环中刷新阶段,以便在循环到达其最终点(N)之前显示输出。每次迭代都应该在下一次迭代开始之前添加一个可显示的元素。 为此,我写了以下
for(var i:int = 0; i < 280; i++){
addElement(...);
validateNow();
}
但它不像我想要的那样工作。有人有解决方案吗?
答案 0 :(得分:0)
你需要将这个冗长的工作分开,以便它可以在多个帧上发生。代码执行时,Flash / Flex不会更新屏幕。请查看Flash的elastic race track以了解原因。 Flex组件生命周期也会在其上添加另一层。顺便说一句,调用validateNow()
可能计算成本很高,可能会使你的循环需要更长时间:)
有许多方法可以解决循环中的工作。
以下是使用callLater()的简单示例:
private function startWorking():void
{
// create a queue of work (whatever you are iterating over)
// in your loop you're counting to 280, you could use a
// simple counter variable here instead
var queue:Array = [ a, b, c];
callLater(doWork, [ queue ] );
}
private function doWork(workQueue:Array):void
{
var workItem:Object = workQueue.shift();
// do expensive work to create the element to add to screen
addElement(...);
if (workQueue.length > 0)
callLater(doWork, workQueue);
}
您可能希望一次处理多个项目。您也可以使用ENTER_FRAME事件而不是callLater()
执行相同的操作(实质上,这是callLater()
正在执行的操作)。
<强>参考强>: