【问题标题】:AS3 for Air events issues空中事件问题的 AS3
【发布时间】:2016-09-26 01:47:58
【问题描述】:

我在理解为什么在从另一个函数中调用一个函数时某些事件不会触发时遇到了一些问题。

这是发生了什么,我不知道为什么:
当应用程序存储目录中没有 test.xml 文件时,writecamfile() 会执行,但似乎 oncomplete() 函数永远不会触发。预加载器仍然可见,并且跟踪不起作用。
如果文件存在,readcamfile() 会正常触发,oncomplete 会隐藏预加载器并返回跟踪。

我的问题是为什么没有 test.xml 文件时 oncomplete() 不触发? 我的逻辑是检查文件是否不存在,创建它然后读取它。

非常感谢任何指针。 提前感谢您,祝您有美好的一天!

托尼

    package util
    {
    import flash.filesystem.*;
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.events.*;
    import flash.display.*;
    import flash.events.Event;
    import flash.events.MediaEvent;
    import flash.events.MouseEvent;
    import flash.media.CameraUI;    
    import flash.media.MediaPromise;
    import flash.media.MediaType;
    import fl.containers.*;
    import fl.controls.*;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLVariables;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequestMethod;

    dynamic public class cam5 extends MovieClip
    {
    public var preloader:MovieClip;
    public function cam5()
    {
        var tmp_file:File = File.applicationStorageDirectory.resolvePath('test.xml');
        if (tmp_file.exists)
        {// File exists
            preloader.visible = true;
            readcamfile(null); // check settings from the camera file

        } else
        {// File doesn't exist
            writecamfile();
            preloader.visible = true;
        }
        function readcamfile(event:Event):void
        {
            var loader:URLLoader = new URLLoader(new URLRequest(File.applicationStorageDirectory.resolvePath('test.xml').url));
            loader.addEventListener(Event.COMPLETE, oncomplete);
        }

        function writecamfile():void
        {
            var xmlstr:XML = <images></images>;
            var file:File = File.applicationStorageDirectory.resolvePath("test.xml");
            var fileStream:FileStream = new FileStream();
            fileStream.open(file, FileMode.WRITE);
            var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n';
            outputString += xmlstr.toXMLString();
            fileStream.writeUTFBytes(outputString);
            fileStream.addEventListener(Event.COMPLETE, readcamfile);
            fileStream.close();         
        }

        function oncomplete(event:Event):void
        {
            var xml:XML = new XML(event.currentTarget.data);

            var chkcount : Boolean = (xml.children().length() > 0);

            if(chkcount)
            {
                var xmlcount:int = xml.children().length(); //test children count
                var camXMLList:XMLList = xml.img;
                var count:int = camXMLList.length(); //test list count

                for(var i:int=0; i<xmlcount; i++)
                {
                    var _row = xml.children()[i];
                }
                preloader.visible = false;
                trace(_row.text()+'\n'+xmlcount+'\n'+count);
            }else
            {
                preloader.visible = false;
                trace("no images");
            }

        }           
    }
    }
    }

【问题讨论】:

    标签: actionscript-3 events actionscript air


    【解决方案1】:

    正如documentation 所说:

    当同步打开 File 对象时,调用者会暂停,同时从底层文件读取或写入请求的数据。

    在同步写入操作完成后添加监听器。

    【讨论】:

      【解决方案2】:

      我实际上已经弄清楚了这一点。 无需在 writecamfile 上添加事件侦听器,您只需在关闭流后重新初始化对 readcamfile 的调用,如下所示:

      fileStream.close();
      readcamfile();
      

      如果您确实需要在函数中保留 event:Event 参数,您可能需要像这样重新初始化函数:

      readcamfile(null);
      

      因为函数需要一个参数

      【讨论】:

        猜你喜欢
        • 2014-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 2023-04-09
        相关资源
        最近更新 更多