0

COMPLETE_EVENTを待つ時間を節約できるように、複数のURLLOADERを含む画像をアップロードしたいと思います。

場合によっては、ブロックされる可能性があり、完了イベントを発生させず、セキュリティエラーを発生させず、ステータスイベントを発生させず、例外をスローしません。イベントをまったく発生させないだけです。

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();
        }
    }

ロード操作は非同期でシングルスレッドです。なぜこれがブロックされる可能性がありますか?

4

2 に答える 2

1

これを見つけました:

ブラウザは通常、2つの同時HTTPキープアライブ接続のみを許可します。他の接続は延期されます。


このシナリオでは、ベストプラクティスでは、URLLoaderの単一インスタンスを使用する必要があります。競合する通話によってどこかでブロックされている可能性があります。また、単純なフラグを使用して、ローダーが既存の呼び出しでビジーであるかどうかを検出してから、別の呼び出しを行うこともできます。これは、5秒ごとにリクエストを行うシングルローダーを使用した実際の例で、シングルローダーと「isOpen」チェックの両方を示しています。

この答えを試してください: ポーリング時にURLLoaderがスタックします

于 2011-09-19T07:48:28.300 に答える
1

このバージョンに基づく回答:
https://stackoverflow.com/revisions/7466248/1

あなたのコードを見るとURLLoader、ループの各反復で同じインスタンスを使用しています。

の新しいインスタンスを作成し、URLLoaderそれを arrayroPoolに追加する必要があります。これは、現在、同じことを同じ に対して繰り返し実行しているためです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);
    }
}

新しい答え:

キューを作成して、一度に URLLoader のインスタンスを 1 つだけ持つようにしてください。大まかな例:

クラス:

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)
    );
}

これがお役に立てば幸いです。

于 2011-09-19T03:57:22.627 に答える