XML项目的事件加载顺序

时间:2014-03-23 14:04:46

标签: xml actionscript-3

我尝试加载XML数据,然后将其用于将来的方法。

Main.as:

public class Main extends MovieClip{

    var xmlM:XmlManager;
    var xmlGenerated:Boolean = false;

    public function Main(){
        trace("Main() called");
        addEventListener(Event.ENTER_FRAME, update);
    }

    public function update(e:Event) {           
        trace("update() called");
        if (!xmlGenerated) {
            this.generateXmlContent();
            xmlGenerated = true;
        }
    }

    public function generateXmlContent() {
        trace ("generateXmlContent() called");
        var xmlM = new XmlManager("loaded.xml");
        xmlM.printData();
    }
}

XmlManager.as:

public class XmlManager {
    private var levelXML:XML; 
    private var myLoader:URLLoader; 
    private var dataString:String;

    public function XmlManager(file:String){
        trace("XmlManager() called");
        levelXML = new XML();
        var XML_URL:String = file;
        var myXMLURL:URLRequest = new URLRequest(XML_URL);
        myLoader = new URLLoader(myXMLURL);
        myLoader.addEventListener("complete", startApp);
    }

    private function startApp(eventDataLoaded:Event){
        trace("startApp() called");
        levelXML = XML(myLoader.data);
        dataString = levelXML;
    }

    public function printData(){
        trace("printData() called");
        trace(dataString);
    }
}

当我加载数据时,我得到了一个Main()调用的跟踪,调用了update(),调用了generateXmlContent(),调用了XmlManager(),调用了printData(),调用了null,startApp(),调用了update()。

这意味着main运行中的所有代码首先包括输入框架方法,生成xml类但是在返回null时不传递或生成数据。

对我来说这意味着我没有为我生成Xml。我已经读过AS3中的XML加载是异步的,但是下面使用我的布尔条件仍然不起作用,因为我在我的主类中使用它作为生成数据的方法。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果您修复了代码中的多个错误,它应该适用于XML加载。第一个是关于存储xml原始数据的变量,第二个是如何创建XML:

private function startApp(eventDataLoaded:Event){
    trace("startApp() called");
    dataString = myLoader.data;
    levelXML = new XML(dataString);
}

您应该等待XML,您不能实例化Xml管理器并立即访问加载的XML。另外,如果在启动主循环之前加载XML,那么在循环中加载XML并不是一个好主意。

  

您能否告诉我们如何等待XML完全加载?

var xmlM:XmlManager;

private function Main():void {
    trace("Main() called");
    //Load xml first
    xmlM = new XmlManager();
    //Wait for XML
    xmlM.loadWithCallback("loaded.xml", onLoadXml);
}

public function update(e:Event) {
    trace("update() called");
    trace(xmlM.levelXML);
}

private function onLoadXml():void {
    trace("XML is loaded, start game");
    addEventListener(Event.ENTER_FRAME, update);
}

对XmlManager进行了一些小改动:

public class XmlManager {

    private var _levelXML:XML;
    private var _dataString:String;
    private var _loader:URLLoader;
    private var completeCallback:Function;

    public function XmlManager() {
        trace("XmlManager() called");
        _loader = new URLLoader();
        _loader.addEventListener(Event.COMPLETE, onComplete, false, 0, true);
    }

    public function loadWithCallback(url:String, onLoadXml:Function):void {
        completeCallback = onLoadXml;
        _loader.load(new URLRequest(url));
    }

    private function onComplete(e:Event):void {
        trace("XML loaded");
        _dataString = _loader.data;
        _levelXML = new XML(_dataString);
        completeCallback();
        completeCallback = null;
    }

    public function printData() {
        trace("printData() called");
        trace(_dataString);
    }

    public function get levelXML():XML {
        return _levelXML;
    }

    public function get dataString():String {
        return _dataString;
    }
}