2009-01-18 84 views
2

更新:在瀏覽器中運行Flash時會有效,但如果從IDE運行,則不起作用。如果您遇到同樣的問題,您可能想嘗試在瀏覽器中運行。URLLoader在輪詢時卡住

我正在使用Flash & 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."); 
} 
} 

這不是一個重要的項目,但任何想法將不勝感激!

+0

「作品」,你的意思是「問題是可重現的」,或者相反,它只能在IDE中重現? (哪個IDE,BTW?) – 2009-01-18 22:28:42

回答

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

我只是猜測在這裏,但也許閃存引擎被各種並行URLLoader s(如果由於某種原因被卡住超過兩秒鐘,你已經有兩個,等等)

我的想法是:使用一個URLLoader。在init()函數中設置回調函數和事件掛鉤,並調用load(),並在每次檢查服務器更改時重用相同的實例。這樣,當URLLoader仍然忙時,新的加載請求將被忽略,或者它將取消前一個(不確定哪個)。

1

也有可能您的對象正在被GC清理,因爲它們沒有連接到主對象圖。

+0

不,那不是。我使用URLLoader的作用域並在一個方法定義中創建,而且經常使用,它們總是可以順利運行。 – 2009-01-19 16:31:43

1

使用Fiddler或Charles檢查HTTP流量也是值得的,它可以幫助您更好地瞭解發生了什麼。

1

瀏覽器通常只允許2個HTTP KeepAlive連接。其他連接被推遲。