在我正在开发的Flash游戏中,有些设置是由外部XML文件设置的。当我通过Flash IDE运行SWF文件时,它加载正常。如果我运行与投影仪(.exe)相同的文件或独立的SWF文件,则该文件不会加载XML文件。
我的(意外)修复是将错误事件侦听器分配给加载程序对象。当我再次发布文件时,XML正确加载到了投影机和独立的SWF文件中。 (此后,我已经验证了注释掉错误事件处理程序可以恢复该错误)。
这是涉及的代码块(除去了多余的代码和函数调用):
public function getSettings():void {
outputBox = getChildByName("output_box") as TextField;
var xmlLoader:URLLoader = new URLLoader();
var xmlData:XML = new XML();
xmlLoader.addEventListener(Event.COMPLETE, loadXML, false, 0, true);
xmlLoader.addEventListener(ErrorEvent.ERROR, function (e:Error)
{ outputBox.appendText(e.message) });
try {
xmlLoader.load(xmlPath);
}
catch(err:Error) {
trace(err.message);
outputBox.appendText(err.message);
checkChances("0");
}
function loadXML(e:Event):void {
try {
xmlData = new XML(e.target.data);
var chances:String = xmlData.chances.text();
var dbURL:String = xmlData.database.text();
trace("Chances are set to: " + chances);
trace("Database URL is set to: " + dbURL);
outputBox.appendText("Chances are set to: " + chances);
}
catch(err:Error) {
outputBox.appendText(err.message);
}
checkChances(chances);
dbPath = new URLRequest(dbURL);
}
}
让我知道您是否遇到过这种情况,或者是否可以对可能发生的事情有所了解。谢谢!
编辑:
这是无效的代码。 (我还编辑了可以显示我取出的所有其他位的代码,以防万一它们可能会影响到它):
public function getSettings():void {
outputBox = getChildByName("output_box") as TextField;
var xmlLoader:URLLoader = new URLLoader();
var xmlData:XML = new XML();
xmlLoader.addEventListener(Event.COMPLETE, loadXML, false, 0, true);
/*xmlLoader.addEventListener(ErrorEvent.ERROR, function (e:Error)
{ outputBox.appendText(e.message) });*/
try {
xmlLoader.load(xmlPath);
}
catch(err:Error) {
trace(err.message);
outputBox.appendText(err.message);
checkChances("0");
}
function loadXML(e:Event):void {
try {
xmlData = new XML(e.target.data);
var chances:String = xmlData.chances.text();
var dbURL:String = xmlData.database.text();
trace("Chances are set to: " + chances);
trace("Database URL is set to: " + dbURL);
outputBox.appendText("Chances are set to: " + chances);
}
catch(err:Error) {
outputBox.appendText(err.message);
}
checkChances(chances);
dbPath = new URLRequest(dbURL);
}
}
最佳答案
在第一个addEventListener上,您要告诉它使用弱引用(调用的最后一个参数)。您的loadXML函数在getSettings()方法中定义。一旦离开getSettings()范围,loadXML就会超出范围。剩下唯一引用loadXML的是事件侦听器,但是由于您告诉它使用弱引用,因此不会阻止对其进行垃圾回收。因此,在事件引发时,loadXML方法可能已被垃圾回收。
我的猜测是,当您定义另一个侦听器时,定义的匿名方法将围绕getSettings()范围(因为它是该方法的范围的一部分),这会将loadXML()保持在范围内。
您真正应该做的是将loadXML方法重构为对象上的实际成员函数,而不是在getSettings()中定义的匿名方法。这样可以使事情保持整洁,并防止您看到垃圾回收,因为只要对象执行该方法,该方法就会一直处于作用域内。
如果由于某种原因您不想使loadXML成为成员函数,则删除弱引用标志应该足以解决该问题。但是,由于这些匿名方法的工作方式,最终可能会导致一些内存泄漏。
关于xml - ActionScript 3是否需要XML错误事件处理程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/489510/