2012-06-01 3 views
1

У меня возникли трудности с управлением потоком программ, когда 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 до тех пор, пока у модели не будет данных.

Спасибо.

+0

Вам необходимо перепроектировать поток вашего приложения. Положитесь на то, что данные от загрузчика не всегда доступны. Рассмотрите тот факт, что, если нагрузка не могла получить данные вообще. В этом случае вы хотите отобразить ошибку. Обработка ошибок всегда должна быть решена. С меньшими усилиями вы можете добиться гораздо большего. –

ответ

1

Ну, вы не указали ни одного кода, который бы очень помог, но вот несколько указателей.

Что должно случиться: используйте погрузчик. Слушайте, когда он загружен. Когда запускает событие COMPLETE, продолжайте. Что происходит: используйте загрузчик. Слушайте, когда он загружен. Но перед тем, как произойдет событие COMPLETE, управление программой возвращается к вызывающему классу. Так что пока программа продолжает движение и выдает ошибку, потому что она пытается получить доступ к данным, которые являются нулевыми.

Много Flex - асинхронный. Это означает, что когда вы пытаетесь загрузить из внешнего источника, программный контроль сразу же возвращается, как вы отметили.

Для того чтобы иметь желаемый вид программы, вам необходимо иметь функцию, которая вызывает вызов load() после этого вызова. Затем, когда запускается прослушиватель COMPLETE, вы можете выполнить оставшуюся часть кода, который вызывает нулевое исключение.

+1

Не * all * of flex является асинхронным, но 'Loader' есть. Большая часть actionscript и flex однопоточная и синхронная. –

+0

@ 32bitkid Хорошее разъяснение. Сегодня утром маленький мозг мертв. –

+0

Это может быть синхронно, но вы не можете рассчитывать на порядок, в котором это происходит. –

Смежные вопросы