轮询时URLLoader卡住了

时间:2009-01-18 18:30:52

标签: flash networking actionscript

更新:某种方式在浏览器中运行Flash时有效,但如果从IDE运行则无效。如果您遇到同样的问题,可能需要尝试在浏览器中运行。

我正在制作一个聊天应用程序,它使用Flash& amp;来自我的服务器重复读取文本文件。 Actionscript 3.0。我用URLLoader打开文件,它一开始工作正常。但是,大约10次调用后,URLLoader卡住了。

它不会给出完成事件,不会给出安全性错误,不会给出状态事件并且不会抛出异常。它根本不会发射任何事件。我甚至在URL中添加了一个随机值,以确保它不是一些缓存问题。当然,我可以检测到它何时卡住,但似乎没有办法解开它。即使我在URLLoader上调用close()然后将其设置为null并创建另一个,它也不会恢复轮询。

以下是轮询服务器并每两秒调用一次的函数。

private function check_server() {
 var url:String = "http://coworkthailand.com/say/snd/index.php?"+Math.random();
 if (loader != null) {
  trace("was already checking "+loader.bytesLoaded+" / "+loader.bytesTotal);
  return;
 }
 loader =  new URLLoader();
 loader.dataFormat = URLLoaderDataFormat.TEXT;
 loader.addEventListener(Event.COMPLETE, completeHandler);
 loader.addEventListener(flash.events.IOErrorEvent.IO_ERROR, 
  function(e:Event) { loader = null; trace("fail"); })
 loader.addEventListener(flash.events.SecurityErrorEvent.SECURITY_ERROR, 
  function(e:Event) { loader = null; trace("security error"); })
 loader.addEventListener(flash.events.HTTPStatusEvent.HTTP_STATUS,
  function(e:flash.events.HTTPStatusEvent) { trace("status "+e.status); });
 try {
  loader.load(new URLRequest(url));
 } catch (error:Error) {
  trace("Unable to load requested document.");
 }
}

这不是一个重要的项目,但任何想法都会非常感激!

5 个答案:

答案 0 :(得分:2)

对于这种情况,最佳实践要求使用URLLoader的单个实例;你有可能通过竞争电话在某个地方被封锁。同样,你可以尝试使用一个简单的标志来检测你的加载器在创建另一个之前是否忙于现有的呼叫;这是一个工作示例,使用单个加载器每五秒发出一次请求,显示单个加载器和“isOpen”检查:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="app_init()">    
    <mx:Script>
        <![CDATA[

            private var timer:Timer;
            private var loader:URLLoader;
            private var isOpen:Boolean;

            private function app_init():void
            {
                timer = new Timer(5000)
                timer.addEventListener(TimerEvent.TIMER, timer_tick, false, 0, true)

                loader = new URLLoader();
                loader.addEventListener(Event.OPEN, loader_open);
                loader.addEventListener(Event.COMPLETE, loader_complete);

                // Start the timer
                timer.start();
            }

            private function timer_tick(event:TimerEvent):void
            {
                // Check if the loader's busy before calling load, and/or close()
                if (!isOpen)
                {
                    // loader.close();
                    loader.load(new URLRequest("http://mydomain.com/myfile.txt"));
                }   
            }

            private function loader_open(event:Event):void
            {
                // Mark as open
                isOpen = true;
            }

            private function loader_complete(event:Event):void
            {
                // Do work

                // Mark as closed
                isOpen = false;
            }

        ]]>
    </mx:Script>    
</mx:Application>

希望它有所帮助!祝你好运。

答案 1 :(得分:1)

我只是在这里猜测,但也许Flash引擎被各种并行的URLLoader阻止了(如果由于某种原因,一个人卡住了两秒多一点,你已经有两个,等等。)

我的想法是:使用一个URLLoader。在init()函数中设置回调和事件挂钩,并调用load(),并在每次检查服务器进行更改时重用相同的实例。这样,当URLLoader仍然忙时,新的加载请求将被忽略,或者它将取消前一个(不确定是哪个)。

答案 2 :(得分:1)

由于GC没有连接到主对象图,因此GC也可能正在清理您的对象。

答案 3 :(得分:1)

使用Fiddler或Charles检查您的HTTP流量也值得一试,它可以帮助您更好地了解正在发生的事情。

答案 4 :(得分:1)

浏览器通常只允许2个HTTP KeepAlive连接。其他连接被推迟。