0

我有这个程序,它需要加载一个文本文件,它可以这样做,但由于 AS3 上的所有内容都是多线程的,即使它没有加载,它也会继续执行该程序。就像,如果我要创建一个加载文本的函数,然后让它返回加载的文本,它总是会返回“未定义”。我必须在完成时添加一个事件侦听器,但是我必须处理文本返回的方式很尴尬。有什么方法可以让程序等待,或者在加载之前什么都不做?

4

2 回答 2

0

听起来您正在寻找的是同步加载数据,以便您可以进行加载调用并立即返回,如下所示:

# (this actually is not actionscript)
fileDataContents = open("file.txt", "r");

然后让 fileDataContents 立即可用。

按照设计,这不是 Flash 的工作方式。

在闪存中加载外部数据不是多线程的,而是异步的。未完成同步加载的一个很好的原因是它会导致程序在操作期间阻塞/锁定,从而可能导致糟糕的用户体验。

举个例子,如果这是通过网络加载文件:如果用户的互联网连接刚刚中断/中断或在服务器上突然移动/删除/修改怎么办?或者,如果文件大小适中但用户正在拨号,该怎么办?

在大多数情况下,这是您无法控制的,由此产生的行为可能是它导致 flash 在尝试加载时“永远”冻结在用户的浏览器窗口中,可能会导致整个浏览器崩溃,最终导致用户不佳经验。通过在该循环中阻止/锁定程序,您将无法适当地恢复或响应用户。

于 2013-03-18T00:00:32.503 回答
0

不,你不能。

像现在这样监听 COMPLETE 事件是等待并在完成后继续应用程序流程的正确方法。我看不出这会如何变得尴尬 - 我建议更新您的问题,以包含有关让您对事件系统感到不舒服的原因的信息,以便我可以从那里为您提供帮助。

也许您只是没有以一种与事件系统配合良好的方式来构建您的代码。以下是如何设置一种非常简洁、直接的方式来加载一些数据并在完成后启动应用程序。

这是文档类,它可以纯粹用作加载文本数据的通道,这些数据将被转发到实际应用程序类的新实例:

public class Main extends Sprite
{

    private var _application:Application;
    private var _loader:URLLoader;


    public function Main()
    {
        var fileUrl:URLRequest = new URLRequest("file.txt");

        _loader = new URLLoader(fileUrl);
        _loader.addEventListener(Event.COMPLETE, _textLoaded);
    }


    private function _textLoaded(e:Event):void
    {
        _loader.removeEventListener(Event.COMPLETE, _textLoaded);

        // Load the main Application with the required text data.
        _application = new Application( _loader.data );
    }

}

然后是你的Application,你可以考虑你的中心类。:

public class Application
{

    public function Application(textData:String)
    {
        // Here we have access to the required text, and we can
        // begin preparing the main Application.
        trace(textData);
    }

}
于 2013-03-18T00:03:30.533 回答