【问题标题】:Flex Mobile validateNow() not workingFlex Mobile validateNow() 不工作
【发布时间】:2013-05-21 02:25:17
【问题描述】:

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

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

但它不像我想要的那样工作。请问有人有解决办法吗?

【问题讨论】:

  • 也许你解释了你想要完成的事情;我们可以指导您更好地解决您的问题。我不希望在 Flex 移动应用程序中向舞台添加 280 个项目会非常有效。也许您更适合使用不需要渲染所有 280 个元素的基于列表的控件。

标签: apache-flex mobile stage


【解决方案1】:

您需要将这项冗长的工作分开,以便它可以在多个帧中进行。执行代码时,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() 正在做的事情)。

参考文献

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2018-11-09
    • 1970-01-01
    相关资源
    最近更新 更多