是否有某种方法可以立即强制'updatedisplaylist',而不是在某些时候

时间:2010-07-14 18:40:03

标签: flex actionscript-3 actionscript flex3

在flex组件生命周期中,在我们对components属性进行一些更改之后,invalidation方法会调度对commitPropertiesupdateDisplayList等方法的调用。我需要立即拨打updateDisplayList。有没有直接的方法来做到这一点。 目前,两个标签在完成循环后同时更改。相反,我需要它像这样工作,首先渲染更新的'myButton1'标签,然后进入循环,然后更新myButton2的标签。我知道,这是弹性赛道问题,但是没有办法实现这个目标吗?

myButton1.label = 'New Label1' ;
// Some logic to forcibly make the screen reflect it

for (var i:int = 0; i < 500 ; i ++){
//a dummy loop

}

myButton2.label = 'New Label2' ;

4 个答案:

答案 0 :(得分:2)

您可以使用myButton1.validateNow()但不建议使用它,因为您最终可能会在同一帧上多次使用相同的组件更新。

答案 1 :(得分:2)

使用validateNow()。但是,我会谨慎使用它。使用invalidateDisplayList()将强制updateDisplayList()在下一个渲染器事件上运行。

每个帧都会发生渲染事件。 Flex默认每秒发生24帧。您确定需要更快地更改这些值吗?

答案 2 :(得分:1)

我会为myButton1设置标签,然后将剩余的代码放入一个单独的方法中,并使用callLater调用该方法:

private function foo():void {
    myButton1.label = 'New Label1';
    this.callLater(bar);
}

private function bar():void {
    for (var i:int = 0; i < 500 ; i ++){ //a dummy loop
    }
    myButton2.label = 'New Label2';
}

这样myButton1会在进入你的循环之前更新以显示新标签,因为callLater在事件队列被清除之前不会调用bar,这使myButton1有机会更新。

答案 3 :(得分:0)

invalidateDisplayList()或valdiateNow()将为您执行此操作,但过多使用这些将最终导致内存泄漏。