Flex如何使用callLater?

时间:2014-04-28 12:48:20

标签: flex

在我的flex移动应用程序中,我有一个循环运行超过100次迭代。在每次迭代中,我都在更新特定Label的一些属性。由于循环耗时,我需要更新屏幕并在每次迭代时显示中间结果。如何断开循环并刷新显示列表?

function theFunction():void{
 for var i:int = 0; i < n; i++{
  doBusyStuff();
  label_1.text = "iteration"+" i";
 }
}

3 个答案:

答案 0 :(得分:2)

在这种情况下,我更喜欢使用flash.utils.setTimeout()

import flash.utils.setTimeout;

function theFunction(limit:int, current:int = 0):void 
{
    if (current >= limit)
        return;

    doBusyStuff();
    label_1.text = "iteration "+ current.toString();

    setTimeout(theFunction, 0, limit, current+1);
}

但是,setTimeout()callLater()都取决于刻度线或帧速率,这意味着它们不会尽可能快地执行。因此,如果您还希望它运行得更快,那么每次调用都应该运行几个循环。

答案 1 :(得分:0)

有几种方法可以强制重绘组件:

invalidateDisplayList();
invalidateProperties();
invalidateSize();

只需在函数中使用组件所需的任何内容,然后使用callLater(yourRedrawFunction);

在脚本后调用它

编辑:例如,在您的情况下:

function theFunction():void{
 for var i:int = 0; i < n; i++{
  doBusyStuff();
  label_1.text = "iteration"+" i";
 }
 callLater(yourRedrawFunction);
}

答案 2 :(得分:0)

另一种解决方案,类似于Chaniks&#39;回答,使用DateTime来检查循环在每次迭代中运行了多长时间。一旦检测到它已经运行了太长时间,它就会结束循环并在下一帧上再次拾取。

var i:int;
function callingFunction():void {
  i = 0;
  stage.addEventListener(Event.ENTER_FRAME, theFunction);
}

function theFunction(e:Event):void {
  var time:DateTime = new DateTime();
  var allowableTime:int = 30;  //Allow 30ms per frame
  while ((new DateTime().time - time.time < allowableTime) && i < n) {
    doBusyStuff();
    i++;
  }
  if (i >= n) {
    stage.removeEventListener(Event.ENTER_FRAME, theFunction);
  }
  label_1.text = "iteration"+" i";
}