空中事件问题的 AS3

Posted

技术标签:

【中文标题】空中事件问题的 AS3【英文标题】:AS3 for Air events issues 【发布时间】: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");
            

                   
    
    
    

【问题讨论】:

【参考方案1】:

正如documentation 所说:

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

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

【讨论】:

【参考方案2】:

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

fileStream.close();
readcamfile();

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

readcamfile(null);

因为函数需要一个参数

【讨论】:

以上是关于空中事件问题的 AS3的主要内容,如果未能解决你的问题,请参考以下文章

谁在 AS3 中拾取分派到事件流的事件?

AS3 flash 键盘事件空格键问题

AS3事件类型

flash AS3 如何删除舞台事件侦听器

网络广播中的 AS3-ID3 事件

Flash CS4 AS3 事件不起作用