2013-05-25 67 views
0

我有一个长而忙的循环,应该在舞台上迭代地添加元素。由于执行整个循环需要几秒钟(i = 1:N),我只想刷新每个循环的阶段,以便在循环达到其最终点(N)之前显示输出。每次迭代应在下一次迭代开始前添加可显示元素。 为此,我写了下面的Flex手机validateNow()不工作

for(var i:int = 0; i < 280; i++){ 
addElement(...); 
validateNow(); 
} 

但它不喜欢的工作,我想。任何人有解决方案吗?

+0

它的Flex移动应用程序 – hassicho

+1

也许如果你解释你试图完成;我们可以指导您更好地解决您的问题。我不希望在Flex应用程序中添加280个项目会非常有效。也许你会更适合使用基于列表的控件,它不需要渲染全部280个元素。 – JeffryHouser

回答

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); 
} 

您可能需要同时处理超过1项。您也可以使用ENTER_FRAME事件代替callLater()(本质上,这是callLater()正在执行的操作)来做同样的事情。

参考