Flash AS3在加载之前不执行任何操作

时间:2013-03-17 18:27:01

标签: actionscript-3 text load

我有这个程序,它需要加载一个文本文件,它可以做,但由于一切都是AS3上的多线程,它继续程序,即使它没有加载。就像,如果我要创建一个加载文本的函数,然后让它返回加载的文本,它将始终返回“undefined”。我必须在它完成时添加一个事件监听器,但是我必须处理文本返回的方式很尴尬。有没有办法让程序只是等待,或者什么都不做,直到它被加载?

2 个答案:

答案 0 :(得分:0)

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

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

然后立即使用fileDataContents。

根据设计,这不是闪存的工作原理。

在闪存中加载外部数据不是多线程的,而是异步。没有进行同步加载的一个很好的理由是它会导致在操作期间阻塞/锁定程序,从而可能导致用户体验不佳。

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

在大多数情况下,这是你无法控制的,结果可能是导致闪存在用户的浏览器窗口中“永远”冻结,因为它试图加载,可能用它取下整个浏览器,最终以糟糕的用户体验。通过在该循环中阻止/锁定程序,您将无法正确恢复或响应用户。

答案 1 :(得分:0)

不,你不能。

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

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

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

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);
    }

}