我有这个程序,它需要加载一个文本文件,它可以这样做,但由于 AS3 上的所有内容都是多线程的,即使它没有加载,它也会继续执行该程序。就像,如果我要创建一个加载文本的函数,然后让它返回加载的文本,它总是会返回“未定义”。我必须在完成时添加一个事件侦听器,但是我必须处理文本返回的方式很尴尬。有什么方法可以让程序等待,或者在加载之前什么都不做?
2 回答
听起来您正在寻找的是同步加载数据,以便您可以进行加载调用并立即返回,如下所示:
# (this actually is not actionscript)
fileDataContents = open("file.txt", "r");
然后让 fileDataContents 立即可用。
按照设计,这不是 Flash 的工作方式。
在闪存中加载外部数据不是多线程的,而是异步的。未完成同步加载的一个很好的原因是它会导致程序在操作期间阻塞/锁定,从而可能导致糟糕的用户体验。
举个例子,如果这是通过网络加载文件:如果用户的互联网连接刚刚中断/中断或在服务器上突然移动/删除/修改怎么办?或者,如果文件大小适中但用户正在拨号,该怎么办?
在大多数情况下,这是您无法控制的,由此产生的行为可能是它导致 flash 在尝试加载时“永远”冻结在用户的浏览器窗口中,可能会导致整个浏览器崩溃,最终导致用户不佳经验。通过在该循环中阻止/锁定程序,您将无法适当地恢复或响应用户。
不,你不能。
像现在这样监听 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);
}
}