AS3:加载/读取文本文件

时间:2014-12-29 07:18:54

标签: actionscript-3 flash

我一直在尝试加载一个文本文件几个小时,但我仍然被困住了。名为 Pi.txt 的文本文件包含许多Pi编号的数字。所以我写了一个名为 PiLoader 的类来加载文件:

package Pi
{
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class PiLoader
    {
        private static var piURL:URLRequest = new URLRequest("../src/Pi/Pi.txt");
        private static var textLoader:URLLoader = new URLLoader(piURL);
        private static var pi:String;

        public function PiLoader() {}

        public static function getPi():String {
            textLoader.addEventListener(Event.COMPLETE, onLoaded);
            return pi;
        }

        private static function onLoaded(e:Event):void {
            var loader:URLLoader = e.target as URLLoader;
            pi = loader.data;
        }

    }

}

Main.as 中,我追踪了Pi编号的3位数字:

package Action 
{
        import flash.display.Sprite;

        import Pi.PiLoader;

        public class Main extends Sprite
        {

            public function Main() 
            {
            trace(PiLoader.getPi().substring(0, 4));
            }

        }

}

但我总是得到这个:错误#1009:无法访问空对象引用的属性或方法。我发现 PiLoader 类中的函数 onLoaded()永远不会被调用。这就是我得到那个错误的原因。 需要你的帮助。感谢。

1 个答案:

答案 0 :(得分:0)

您的Error #1009被解雇是因为PiLoader为空,这是正常的。但在这里我想讨论使用的方法。您应该知道在代码中未调用的URLLoader.load()是异步操作,因此您应该等到Event.COMPLETE被触发才能使用返回的数据。在这种情况下,您可以使用如下回调:

Main.as:

package {

    import flash.display.Sprite;

    public class Main extends Sprite {

        private var pi_loader:PiLoader;

        public function Main() {

            pi_loader = new PiLoader();
            pi_loader.getPi(show_pi);

        }

        // your function called only when data is loaded inside the PiLoader
        private function show_pi(pi:String) {

            trace(pi.substring(0, 3));

        }

    }
}

PiLoader.as:

package {

    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class PiLoader {

        private static var piURL:URLRequest = new URLRequest('path_to_file.txt');
        private static var textLoader:URLLoader = new URLLoader(piURL);

        public function PiLoader() {
        }

        public function getPi(callback:Function):void {

            textLoader.addEventListener(Event.COMPLETE, onLoaded);
            function onLoaded(e:Event):void {

                // run our function and give it data
                callback(e.target.data);

            }
            textLoader.load(piURL);

        }

    }

}

希望能帮到你。