1

XMLが外部ソースからロードされるときに、プログラムフローの制御に問題があります。FlashBuilder4.6を使用しています

何が起こるべきか:ローダーを使用してください。ロードされたときにリッスンします。COMPLETEイベントが発生したら、次に進みます。何が起こっているのか:ローダーを使用してください。ロードされたときにリッスンします。ただし、COMPLETEイベントが発生する前に、プログラム制御は呼び出し元のクラスに戻ります。その間、プログラムはnullのデータにアクセスしようとしているため、続行してエラーをスローします。

3つのクラスが含まれます。

  • AdvocacyWiz.mxml-このAIRモバイルアプリのベースMXMLファイル
  • Model.as-モデルクラス
  • myXMLLoader.as-ローダーがデータをロードし、完了時にイベントをディスパッチするクラス。

AdvocacyWiz.mxmlがステージに追加されたら、AdvocacyWiz.mxmlで関数setUpModel()を呼び出しています。そのクラスのsetUpModel関数は次のようになります。

Model.Instance.initialize(); //model is a singleton

initialize関数呼び出しは、私のXMLLoader.asクラスのローダーを呼び出します。ここで、イベントリスナーはCompleteイベントをリッスンしますが、これは遅すぎてnullエラーの発生を防ぐことができません。

編集:ここにコードがあります-

AdvocacyWiz.mxml(これが最初に起動します):

protected function addedToStageHandler(event:Event):void
{
   setUpModel();
   stage.scaleMode = StageScaleMode.NO_SCALE;
   //... additional layout functions

private function setUpModel():void {    
   Model.Instance.initialize();
}

モデルの場合(これは2番目に発生します):

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クラスに戻されません。

ありがとう。

4

1 に答える 1

1

さて、あなたはかなり役立つコードを提供していませんが、ここにいくつかのポインタがあります。

何が起こるべきか:ローダーを使用してください。ロードされたときにリッスンします。COMPLETEイベントが発生したら、次に進みます。何が起こっているのか:ローダーを使用してください。ロードされたときにリッスンします。ただし、COMPLETEイベントが発生する前に、 プログラム制御は呼び出し元のクラスに戻ります。その間、プログラムはnullのデータにアクセスしようとしているため、続行してエラーをスローします。

Flexの多くは非同期です。これが意味することは、外部ソースからロードしようとすると、あなたが指摘したように、プログラム制御はすぐに戻るということです。

load()必要な種類のプログラムフローを得るには、呼び出しがその呼び出しの後に終了する関数が必要です。次に、COMPLETEイベントリスナーが起動すると、null例外の原因となる残りのコードを実行できます。

于 2012-06-01T12:27:57.343 に答える