URLLoader застревает при опросе - PullRequest
2 голосов
/ 18 января 2009

Обновление: каким-то образом это работает при запуске flash в браузере, но не работает, если вы запускаете из IDE. Вы можете попробовать запустить браузер, если у вас возникла та же проблема.

Я создаю приложение для чата, которое несколько раз читает текстовый файл с моего сервера, используя Flash & Actionscript 3.0. Я открываю файл с помощью URLLoader, и сначала он работает нормально. Однако после примерно 10 звонков URLLoader застревает.

Не выдает событие завершения, не выдает ошибку безопасности, не выдает событие состояния и не выдает исключение. Это просто никогда не вызывает события вообще. Я даже добавил случайное значение в URL, чтобы убедиться, что это не проблема кэширования. Конечно, я могу определить, когда он застрянет, но, похоже, нет никакого способа его расклеить. Даже если я вызову close () для URLLoader, а затем установлю для него значение 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 ]

2 голосов
/ 19 января 2009

Для этого сценария лучшая практика требует использования одного экземпляра 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 голос
/ 28 августа 2009

Браузер обычно разрешает только 2 одновременных HTTP-соединения KeepAlive. Другие соединения откладываются.

1 голос
/ 20 января 2009

Также стоит проверить ваш HTTP-трафик с помощью Fiddler или Charles, это может помочь вам лучше понять, что происходит.

1 голос
/ 19 января 2009

Также возможно, что ваш объект очищается с помощью GC из-за того, что они не связаны с графом основного объекта.

1 голос
/ 19 января 2009

Я просто догадываюсь здесь, но, возможно, Flash Engine блокируется различными параллельными URLLoader s (если по какой-то причине кто-то застревает на чуть более двух секунд, у вас уже есть две и т. Д.)

Моя идея такова: используйте один URLLoader. Установите обратные вызовы и перехватчики событий в функции init(), вызовите load() и повторно используйте один и тот же экземпляр каждый раз, когда вы проверяете сервер на наличие изменений. Таким образом, когда URLLoader все еще занят, новый запрос на загрузку либо игнорируется, либо отменяет предыдущий (не уверен, какой).

...