【问题标题】:How to trace order of code execution in actionscript?如何在actionscript中跟踪代码执行顺序?
【发布时间】:2012-11-30 12:02:48
【问题描述】:

我在 AIR 中编写一个移动应用程序,我经常遇到同样的问题:执行顺序是什么?我知道可以确定 UI 类的初始化、创建等顺序。我还可以将跟踪语句放入每个类的构造函数中,并这样做。但这很乏味。

是否有一段通用代码可以让每个类在加载时“宣布”自己?有人写过这样的吗?

伪代码类似于:

for each var class:Class in application
{
     trace(class.getQualifiedClassName.toString();
}

谢谢。

编辑:

这是一个例子。我运行 MyApp.mxml 并在其上放置跟踪语句。第一个视图是一个由数组填充的列表,该数组通过 xml 来自服务器。但是当应用程序加载时,列表是空白的。为什么?由于以下事件顺序,基于我手动插入的跟踪语句:

MyApp::viewnavigatorapplication1_intitializeHandler firing
Model::initialize function firing
XMLLoader::going to http://mysite.com/myxml.xml
MyApp::addedToStageHandler running
HomeListView::viewActivateHandler firing
XMLLoader::xmlLoaded

列表为空的原因是xml是在 HomeListView被激活之后加载的。因此,有一种方法可以获取所有这些信息,而不必在课后的课堂上写下来,这将是有帮助的。请注意,并非所有类都在显示列表中(例如 Model 和 XMLLoader)。

【问题讨论】:

  • 执行顺序是什么?你在用 Flex 吗?如果是这样,Flex 组件生命周期控制生命周期方法的执行顺序,您可能需要花一些时间阅读有关它的内容。我认为大多数课程——无论是否是 Flex——都会发送一个“addToStage”事件。但是,在这种情况下,我不清楚这是否符合您对“负载”的定义。
  • 是的,使用 Flex,是的,我了解生命周期——这就是我所说的“确定初始化顺序”等。假设我有 100 个类。我要问的是是否有办法编写一行或几行代码并让每个类都跟踪“我的构造函数正在运行!”而不必经历并创建 100 次跟踪语句。对于不在显示列表中的类也是如此。
  • 您可以像这样在 AS3 中创建一个全局变量:stackoverflow.com/a/1860855/133840,但我认为这不会满足您的需要。您几乎需要一个全局构造函数跟踪语句。您可能必须尽可能地在类层次结构中向上并调整该构造函数以添加您的代码。它可能涉及重新编译 Flex 框架。你必须对你拥有的每个类层次结构做同样的事情;因为您将无法编辑主 Flash“对象”类。我不确定这会起到什么作用。

标签: actionscript-3 apache-flex flash-builder


【解决方案1】:

在 mm.cfg 文件中指定 AS3Trace 将提供完整的执行功能。

请参阅 this blog post 了解其他隐藏的 mm.cfg 功能,以及 here is some help 让 mm.cfg 在您的移动应用程序中运行。

【讨论】:

    【解决方案2】:

    这里有一些接近你想要的东西:

    var numChildren:Number = this.numChildren;
    for (var i:int = 0; i < numChildren; i++) {
        var displayObject:DisplayObject = this.getChildAt(i);
        displayObject.addEventListener(FlexEvent.INITIALIZE, function (e:FlexEvent):void {
            trace("child " + displayObject.name +" is initializing" );
        });
        displayObject.addEventListener(FlexEvent.CREATION_COMPLETE, function (e:FlexEvent):void {
            trace("child " + displayObject.name +"'s creation is completed" );
        });                     
    }
    

    您需要将其添加到主应用程序的 initialize 事件处理程序中。

    【讨论】:

    • 是的,非常好。有没有办法为不在显示列表上的课程做到这一点?我在上面添加了一个带有额外说明的编辑。
    • 我不认为这会给@David他想要的一切,因为这不是递归的,所以这里不包括孩子的孩子。其次,子组件的initialize事件会在父组件的initialize事件之前调度;所以初始化事件监听器是在初始化事件触发后添加的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 2018-10-02
    相关资源
    最近更新 更多