Требуется ли в ActionScript 3 обработчик событий ошибок для XML? - PullRequest
2 голосов
/ 29 января 2009

Во флеш-игре, которую я разрабатываю, есть некоторые настройки, которые устанавливаются внешним XML-файлом. Когда я запускаю SWF-файл через Flash IDE, он загружается нормально. Если я запускаю тот же файл, что и проектор (.exe) или независимый SWF-файл, он не загружает XML-файл.

Мое (неожиданное) исправление заключалось в назначении прослушивателя событий error для объекта загрузчика. Когда я снова опубликовал файл, 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);
}           

}

Дайте мне знать, если вы столкнулись с этим, или если вы можете пролить свет на то, что может происходить. Спасибо!

EDIT:

Вот код, который не работает. (Я также отредактировал код, который работает, чтобы показать все остальные биты, которые я вынул, на случай, если они могут повлиять на это):

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

}

Ответы [ 3 ]

1 голос
/ 29 января 2009

В первом addEventListener вы говорите ему использовать слабые ссылки (последний аргумент вызова). Ваша функция loadXML определена в вашем методе getSettings (). После выхода из области действия getSettings () loadXML выходит из области видимости. Единственное, что осталось сделать со ссылкой на loadXML - это прослушиватель событий, но поскольку вы говорите ему использовать слабую ссылку, которая не помешает его сборке мусора. Таким образом, к моменту возникновения события метод loadXML, вероятно, является сборщиком мусора.

Я предполагаю, что когда вы определяете другого слушателя, анонимный метод, определенный там, сохраняет область действия getSettings () (как часть области действия этого метода), которая будет держать loadXML () в области.

Что вам действительно нужно сделать, так это преобразовать ваш метод loadXML в реальную функцию-член вашего объекта, а не в анонимный метод, определенный в getSettings (). Это сохранит чистоту и предотвратит сборку мусора, которую вы видите, поскольку метод будет оставаться в области действия до тех пор, пока объект делает это.

Если по какой-то причине вы не хотите делать loadXML функцией-членом, достаточно убрать флаг слабой ссылки, чтобы это исправить. Однако вы можете столкнуться с небольшой утечкой памяти из-за работы этих анонимных методов.

0 голосов
/ 29 января 2009

Это просто дикое предположение, но не возможно, что в более ранней версии программы команда load() была введена до addEventListener(), и вы их переупорядочили (для правильный порядок), когда вы добавили второй, прослушиватель ошибок? Если это так, то это определенно проблема времени. Было бы полезно, если бы вы также включили код, который не работает.

UPDATE

Я думаю Herms правильно. Когда вы добавляете одного локально прослушиваемого слушателя в качестве слабой ссылки , не только сам слушатель, но и также объект URLLoader получает сборщик мусора (поскольку без слушателей он не имеет смысл сохранить его) до завершения загрузки. (Почему это происходит в автономном режиме, а не в Flash IDE, вероятно, случайно, в зависимости от того, как именно работает GC.) Когда вы добавляете секунду, сильная ссылка слушатель события ошибки, tada , не более GCing.

Итак, либо попробуйте то, что предлагает Гермс: используйте более широкую область действия в качестве прослушивателя завершения, или просто отбросьте аргумент слабой ссылки из вызова addEventListener().

0 голосов
/ 29 января 2009

Ответ на ваш вопрос - нет, actionscript 3.0 не требует обработчика событий ошибки для XML. Это даже не требует полного обработчика! В этом суть .addEventListener (), слушатели событий являются необязательными.

Похоже, что с вашим кодом происходит больше, чем вы представляете здесь.
(Вы отключаете прослушиватель события ошибки, и тогда все работает хорошо, это не имеет никакого смысла!)

Вы все время выполняете файлы из одного и того же места? Это мое предположение относительно того, почему XML не загружается, может быть, вы переместили свой файл .swf в другую папку?

...