У меня возникли трудности с управлением потоком программ, когда XML загружается из внешнего источника. Я использую Flash Builder 4.6Поток программы и прослушиватели событий в ActionScript
Что должно случиться: используйте загрузчик. Слушайте, когда он загружен. Когда он запускает событие COMPLETE, продолжайте. Что происходит: используйте загрузчик. Слушайте, когда он загружен. Но перед тем, как произойдет событие COMPLETE, управление программой вернется в вызывающий класс. Таким образом, пока что программа продолжает идти и выдает ошибку, потому что она пытается получить доступ к данным, которые являются нулевыми.
три класса участвует:
- AdvocacyWiz.mxml - базовый файл MXML для этого AIR мобильного приложения
- Model.as - модель класса
- myXMLLoader.as - класс, в котором загрузчик загружает данные, затем отправляет событие, когда это будет сделано.
Я вызываю функцию setUpModel() в AdvocacyWiz.mxml, когда AdvocacyWiz.mxml добавляется на сцену. Функция setUpModel в этом классе просто выглядит следующим образом: Вызов функции
Model.Instance.initialize(); //model is a singleton
инициализации запускает загрузчик в моем классе XMLLoader.as. Вот где прослушиватель событий остается прослушивать событие Complete, что происходит слишком поздно, чтобы предотвратить появление ошибки null.
EDIT: Вот код -
В AdvocacyWiz.mxml (это пожары в начале):
protected function addedToStageHandler(event:Event):void
{
setUpModel();
stage.scaleMode = StageScaleMode.NO_SCALE;
//... additional layout functions
private function setUpModel():void {
Model.Instance.initialize();
}
В модели (это срабатывает вторая):
public function initialize():void {
addEventListeners(); //this includes listener for StoriesXMLLoader.STORY_LOADED event which will be dispatched from the loader class.
useExternalXML();
...
}
private function useExternalXML():void
{
myLoader.getStory("1140");
}
В Loader класс:
public function getStory(storyId:String):void {
var url:String = "http://mysite.com/whatever.xml";
myLoader.dataFormat = URLLoaderDataFormat.TEXT;
myLoader.addEventListener(Event.COMPLETE, storyXMLLoaded);
myLoader.load(new URLRequest(url));
}
private function storyXMLLoaded(e:Event):void {
storyXML = new XML(e.target.data);
dispatchEvent(new Event(StoriesXMLLoader.STORY_LOADED));
}
То, что я хочу сделать, это вызвать setUpModel(), но не возвращать поток в класс mxml до тех пор, пока у модели не будет данных.
Спасибо.
Вам необходимо перепроектировать поток вашего приложения. Положитесь на то, что данные от загрузчика не всегда доступны. Рассмотрите тот факт, что, если нагрузка не могла получить данные вообще. В этом случае вы хотите отобразить ошибку. Обработка ошибок всегда должна быть решена. С меньшими усилиями вы можете добиться гораздо большего. –