ActionScript-3计时问题/不需要的后台多线程

时间:2011-04-25 14:10:59

标签: actionscript-3

我创建了一个包含私有变量和公共获取属性的新类 当我创建一个新的类实例时,它会将文本文件内容加载到私有变量中 - 加载它可能需要一些时间。

创建新实例后,我尝试使用get属性获取private var的值:

var item1:MyItem = new MyItem("0001");

trace(item1.ItemName);

嗯,输出是空白的 ItemName指向的字符串未定义,它包含数据。
所以,它就像一个计时问题,ActionScript可能正在使用后台多线程运行代码,因此它在完成之前调用trace命令来运行MyItem c'tor中的所有方法(将文本文件数据加载到ItemName指向的字符串var)。

有没有办法强制ActionScript避免使用这种不需要的“后台多线程”,并正常运行代码(按命令的顺序)?
我的意思是“在完成第一个命令之前不要运行第二个命令”。

感谢您的帮助..
弗雷迪

3 个答案:

答案 0 :(得分:3)

它不是多线程的,从外部加载文本文件只是一个完全异步的操作。在MyItem类中,您需要为该Loader提供Event.COMPLETE处理程序。从那里,我在做什么:

选项1:在MyItem的文件加载的COMPLETE处理程序中,设置一个标志。使用getter的类必须通过另一个getter检查标志,看看数据是否存在,并使用它(如果它在那里)或设置一个监听器等待它(如果不是)。加载数据后,您可以立即同步访问它(它已缓存)。

选项2:在MyItem中保留“isLoaded”标志的另一种方法是让MyItem的Loader COMPLETE处理程序调度它自己的TEXT_LOADED事件。然后,负责创建MyItem实例的实例会监听它,并且知道在该文本文件存在之前不要求该文本文件的内容。

任何一种方法都可行。由你决定哪一个有意义。如果您不希望立即访问加载的数据(即您在启动时加载文本以便稍后使用),我的第一个选项可能会避免不必要的侦听器。如果您希望在加载的瞬间使用文本文件的数据,则第二种方法是有意义的。

答案 1 :(得分:2)

理想情况下,您要执行的是Observer Pattern

  1. MyItem类添加一个事件处理程序,用于加载XML所用的任何组件/类的Loaded事件。

  2. MyItem类添加一个事件,该事件将从步骤1中冒出Loaded事件,以便MyItem类的客户端可以为其附加处理程序。在您在步骤1中创建的Loaded处理程序中触发此事件。

  3. 将事件处理程序附加到您在步骤2中创建的事件,并将trace代码放在该处理程序中。

答案 2 :(得分:0)

您的代码实际上是在单个线程中运行,但是Actionscript中的典型数据加载类是异步的。在调用跟踪之前,可能没有加载数据。要收到数据加载的通知,您应该在加载对象上使用事件监听器。

var loader:URLLoader = new URLLoader();
loader.addEventListener( Event.COMPLETE, onLoadComplete );
loader.load( new URLRequest( 'path_to_data.xml' ) );

function onLoadComplete( event:Event ):void 
{
     trace( loader.data );
}

AS3 API docs有一个更完整的例子。