зачем блокироваться при загрузке с несколькими URLLOADER s? - PullRequest
0 голосов
/ 19 сентября 2011

Я хочу загрузить изображения с несколькими URLLOADER с, чтобы я мог сэкономить время при ожидании COMPLETE_EVENT.

Иногда это может быть заблокировано, и это не даетсобытие завершения, не выдает ошибку безопасности, не выдает событие состояния и не выдает исключение.Он просто никогда не запускает никаких событий.

private const RO_NUMBER:int = 2;
private var roPool:Array = new Array();

public function init():void {

        for (var i:int = 0; i < RO_NUMBER; i++) {

           loader:URLLoader = new URLLoader();
           loader.dataFormat = URLLoaderDataFormat.TEXT;
           loader.addEventListener(Event.OPEN, onStartUpload);
           loader.addEventListener(Event.COMPLETE, completeHandler);
           loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
           loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
           loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

           roPool.push(loader);
        }
    }

public function startUpload(pictures:ArrayList):void {
        _pictures.addAll(pictures);
        init();
        if (getExternalInfo()) {
            for (var i:int = 0; i < RO_NUMBER; i++) {
                var loader = roPool.pop();

                loader.load(getRequest());
            }
        } else {
            onUploadFinish();
        }
    }

операция загрузки асинхронная и однопоточная. Почему это может быть заблокировано?

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

Нашел это:

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


Для этого сценария лучшая практика требует использования одного экземпляра URLLoader; Скорее всего, вы где-то заблокированы конкурирующих звонки. Кроме того, вы можете попробовать использовать простой флаг, чтобы определить, ваш загрузчик занят существующим вызовом, прежде чем сделать другой; Вот рабочий пример использования одного загрузчика, который делает запросы каждый пять секунд, показывая как одиночный загрузчик, так и проверку «isOpen»:

Попробуйте этот ответ: URLLoader застревает при опросе

1 голос
/ 19 сентября 2011

Ответ основан на этой версии:https://stackoverflow.com/revisions/7466248/1

Из того, что я вижу в вашем коде, вы используете один и тот же экземпляр URLLoader в каждой итерации цикла.

Вам потребуетсясоздайте новый экземпляр URLLoader и добавьте его в свой массив roPool, потому что в данный момент вы неоднократно выполняете одно и то же с одним и тем же URLLoader.

public function init():void
{
    for(var i:int = 0; i<RO_NUMBER; i++)
    {
        var ldr:URLLoader = new URLLoader();

        ldr.dataFormat = URLLoaderDataFormat.TEXT;
        ldr.addEventListener(Event.OPEN, onStartUpload);
        ldr.addEventListener(Event.COMPLETE, completeHandler);
        ldr.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
        ldr.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
        ldr.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

        roPool.push(ldr);
    }
}

Newответ:

Попробуйте создать очередь и иметь только один экземпляр URLLoader за раз, грубый пример:

Класс:

package
{
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.events.Event;

    public class LoadQueuer extends Object
    {
        // Queue
        private var _queue:Array = [];

        /**
         * Standard load
         * @param req Instance of URLRequest
         */
        public function queue(loader:URLLoader, request:URLRequest):void
        {
            _queue.push({LOADER: loader, REQUEST: request});
            _next();
        }

        /**
         * Loads next loader in _queue
         */
        private function _next():void
        {
            if(_queue.length > 0)
            {
                var info:Object = _queue.pop();

                var loader:URLLoader = URLLoader(info.LOADER);

                loader.load(
                    URLRequest(info.REQUEST)
                );

                loader.addEventListener(Event.COMPLETE, _complete);
            }
        }

        /**
         * ..
         * Event.COMPLETE
         */
        private function _complete(e:Event):void
        {
            var loader:URLLoader = URLLoader(e.target);
            loader.removeEventListener(Event.COMPLETE, _complete);

            trace(loader.data);

            _next();
        }
    }
}

Пример использования:

var list:Array = [
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php",
    "http://projectavian.com/test.php"
];

var lc:LoadQueuer = new LoadQueuer();

for each(var i:String in list)
{
    lc.queue(
        new URLLoader(),
        new URLRequest(i)
    );
}

Надеюсь, это поможет вам.

...