FLEX:对话框不能立即显示(FLEX: dialog not display immediatel

2019-08-05 04:02发布

在AIR应用程序中,我有以下代码:

theDialog = PopUpManager.createPopUp(此,TheDialogClass,真)作为TheDialogClass; theDialog.addEventListener(FlexEvent.CREATION_COMPLETE,cpuIntensiveCalc);

在cpuIntensiveCalc结束对话被删除。 该对话框通知用户“的东西是怎么回事,请稍候。”

问题是,cpuIntensiveCalc开始对话之前绘制。 因此,用户体验是应用程序冻结10秒无指示符,则该模态对话框快速闪烁(小于一秒)在屏幕上。

Adobe的文档说这有关CREATION_COMPLETE

当组件完成其构建,属性处理,测量,布置和绘制调度。

所以,这种感觉就像正确的事件。
在完整的名字,我也尝试过

theDialog = PopUpManager.createPopUp(此,TheDialogClass,真)作为TheDialogClass; cpuIntensiveCalc();

但有相同的结果。

TIA

Answer 1:

这样做的原因是,Flash播放器是单线程的,所以你是从,直到数学块完成反应,对话框弹出阻塞UI。

哈克修复时间...

你有两个选择。

(这应该工作,但未经测试)包装在使用callLater的cpuIntensiveCalc()调用,这样就阻止渲染之前,UI可以完成渲染。

要么

使用“绿色线程”分手的处理,这样你就不能完全阻断UI处理。 看一看 。



Answer 2:

(我有同样的问题=>即使这个线程是旧的,我只是想贡献自己的解决方案)

(免责声明:这是一个有点难看,但他们说这是在UI层OK ... ;-))

Flex是单线程(从我们的开发人员的角度至少,我觉得现场线程落后的VM使用)

=>您通常在UI线程中执行代码,用户做了一个小部件的一些动作之后。 任何调用更新UI组件(如setProgress或setLabel)将只在屏幕上的渲染周期结束时被渲染(见再次UiComponent生命周期)。

=>在一个使用callLater therory呼叫“cpuIntensiveCalc”将让框架执行方法之前显示弹出式窗口。

但在实践中,我注意到你通常必须有一对夫妇UI cylces的显示之前弹出,就像这样:

new MuchLaterRunner(popup, 7, cpuIntensiveCalc).runLater();

MuchLaterRunner被定义如下:

public class MuchLaterRunner
    {
        var uiComp:UIComponent;
        var currentCounter = 0;
        var cyclesToWaitBeforeExecution=0;

        var command:Function;

        public function MuchLaterRunner(uiComp:UIComponent, cyclesToWaitBeforeExecution:uint, command:Function)
        {
            this.uiComp = uiComp;
            this.command = command;
            this.cyclesToWaitBeforeExecution =cyclesToWaitBeforeExecution;
        }

        public function runLater() {

            currentCounter ++;
            if (currentCounter >= cyclesToWaitBeforeExecution) {
                uiComp.callLater(command);
            } else {
                // wait one more cycle...
                uiComp.callLater(runLater);
            }
        }

    }

问题是相同的后来打电话setProgress时:我们必须把cpuIntensiveCalc成可以在每个UI周期跑出小调用方法,否则进度不会,呃,进步。



Answer 3:

在弹出使用enterFrame事件。 不要忘了删除enterFrame事件处理程序侦听器 - 否则CPU密集型的方法将在每帧中被调用,崩溃您的应用程序。 如果不能在工作第一,使用一个专用号码作为计数器,并保持在输入帧处理增加了 - 调用CPU重方法,只有当计数器达到适当的值。 查找线索和错误的“适当”的价值。

theDialog = PopUpManager.createPopUp(this, TheDialogClass, true) as TheDialogClass;
theDialog.addEventListener(Event.ENTER_FRAME, onEnterFrame);
private function onEnterFrame(e:Event):void
{
  //can use theDialog instead of e.currentTarget here.
  (e.currentTarget).removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  cpuIntensiveCalc();
}
//in case the above method doesn't work, do it the following way:
theDialog.addEventListener(Event.ENTER_FRAME, onEnterFrame);
private var _frameCounter:Number = 0;
private function onEnterFrame(e:Event):void
{
  _frameCounter++;
  var desiredCount:Number = 1;//start with one - increment until it works.
  if(_frameCounter < desiredCount)
    return;
  //can use theDialog instead of e.currentTarget here.
  (e.currentTarget).removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  cpuIntensiveCalc();
}


文章来源: FLEX: dialog not display immediately