在我的flex移动应用程序中,我有一个循环运行超过100次迭代。在每次迭代中,我都在更新特定Label的一些属性。由于循环耗时,我需要更新屏幕并在每次迭代时显示中间结果。如何断开循环并刷新显示列表?
function theFunction():void{
for var i:int = 0; i < n; i++{
doBusyStuff();
label_1.text = "iteration"+" i";
}
}
答案 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";
}