2011-09-19 58 views
0

我想上传图像多个URLLOADER s,这样我可以节省等待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(); 
     } 
    } 

加载操作是异步和单线程。为什么这可能会被阻止?

回答

1

答案基于这个版本:
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); 
    } 
} 

新答案:

尝试使一个队列并且仅具有在一个时间的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) 
    ); 
} 

希望这可以帮助你。

+0

哦,我忘了复制这条线从我的代码。 – wa7chen

+1

@ wa7chen对.. – Marty

+0

但重点不在这里,你有什么其他想法吗? – wa7chen

1

发现这一点:

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


对于这种情况,最好的做法表明使用 的URLLoader的一个实例;很可能你会通过竞争 电话而被阻止。同样,你可以尝试使用一个简单的标志来检测你的加载器在进行另一个加载器之前是否忙于现有的调用; 这里是一个使用单一装载机发出请求每 五秒钟显示无论是单装载机和“ISOPEN”检查工作的例子:

尝试这样的回答: URLLoader gets stuck when polling

+0

尼斯,我通常排队我的URLLoaders在一个数组中,并删除/加载每个Event.COMPLETE队列中的第一件事。 – Marty

+1

为赢得排队! – Mattias

相关问题