AS3.0 下載隊列類 幫助完成Flash隊列下載

多次試驗發現隊列下載效率真的不太好。還是擴展一個Loader 加入了超時的設置,詳細代碼在跟帖中。
------------------------------------------------
前幾天應徵Flash程序員。被問到爲什麼Flash有時候Loader下載會無緣無故暫停,既不報超時也不報錯。當時沒想到爲什麼?後來被告知正確答案是FlashPlayer的併發下載的Bug。汗
今天自己作了一個隊列下載的單例類。目的就是解決併發的問題和使用Loader的易用性。
原理是,生成了一個類的單例,在全局使用。單例中包括一個Timer時間輪訓,一個array的下載URL列表,一個加載順序的策略。很簡單
如果感興趣的朋友可以拿去用,哈哈。歡迎大家和我討論。
CODE:
LoadLine.as
複製內容到剪貼板
代碼:
package com.FSC.UI.InterActiveObject.DisplayObjectContainer.LoadLine
{
    import Flash.display.MovieClip;
    import Flash.display.Loader;
    import Flash.net.URLRequest;
    import Flash.utils.Timer;
    import Flash.events.*;
    /**下載隊列類
     * @ andy pan
     * @ v1.080506
     */
    public class LoadLine extends MovieClip
    {
        private static var loadLine:LoadLine;
        private static var key:Boolean=false;
        private var _loader:Loader= new Loader();
        private var _loaderList:Array = new Array();
        private var _timer:Timer = new Timer(500);
        private var _isNowLoading:Boolean=false;
        //加載失敗嘗試次數
        private var _tryErrorTime:Number=1;
        //當前加載失敗次數
        private var _tryErrorNowTime:Number = 0;
        public function LoadLine()
        {
            if( !key ){
                throw new Error ("單例,請用 getInstance() 取實例。");
            }
            key=false;
            _timer.addEventListener(TimerEvent.TIMER,everySed);
            _timer.start();
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onCompleteHandler);
            _loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
               _loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);      
               _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
        }
        
        public static function getInstance() : LoadLine {
            if ( loadLine == null ){
                 key=true;
                loadLine = new LoadLine();
            }
            return loadLine;
        }
        
        /**靜態函數 下載命令
        * @param target下載地址
        */
        public function loadFile(target:URLRequest,emergent:Number=10){
            if(emergent==0){
                _loaderList.unshift(target);
                if(_isNowLoading){
                    //如果有正在加載的項目則 暫停
                    cancelNowLoad();
                }
            }else{
                _loaderList.push(target);
            }
        }
        /**終止當前下載
        */
        private  function cancelNowLoad(){
            _loader.close();
        }
        /**每秒監聽 隊列是否有下載
        * @param e 時間參數
        */
        private function everySed(e:TimerEvent){
            //但下載器空閒時
            if((!_isNowLoading)&&(_loaderList.length>0)){
                var tmp_url:URLRequest = _loaderList[0] as URLRequest;             
                _loader.load(tmp_url);
                this.addChild(_loader);
                _isNowLoading = true;
            }
        }
        /**當前下載中的偵聽
        */
        private function progressHandler(e:ProgressEvent){
            this.dispatchEvent(new LoadLineProgressEvent(ProgressEvent.PROGRESS,_loaderList[0],false,false,e.bytesLoaded,e.bytesTotal));
        }
        /**當前下載完成
        */
        private function onCompleteHandler(e:Event){
            this.dispatchEvent(new LoadLineEvent(LoadLineEvent.ONLOADLINECOMPLETE,_loaderList[0],_loader.content));
            _loaderList.shift();//當完成下載後再從隊列中刪除
            _isNowLoading = false;
        }
        /**當加載錯誤進行嘗試處理
        */
        private function onError(e:IOErrorEvent){
            _isNowLoading = false;
            if(_tryErrorNowTime>_tryErrorTime){
                trace("error:下載隊列中有文件加載失敗,並且超過嘗試次數。已從隊列中刪除")
                this.dispatchEvent(new LoadLineEvent(LoadLineEvent.ONLOADLINECOMPLETE,_loaderList[0],false));
                _tryErrorNowTime=0;
                //當完成下載後再從隊列中刪除
                _loaderList.shift();
            }else{
                _tryErrorNowTime++;
            }
        }        
    }
}
自定義加載完成的事件類
LoadLineEvent.as
複製內容到剪貼板
代碼:
package com.FSC.UI.InterActiveObject.DisplayObjectContainer.LoadLine
{
    import Flash.events.Event;
    import Flash.net.URLRequest;
    public class LoadLineEvent extends Event
    {
        public static var ONLOADLINECOMPLETE : String = "onLoadLineComplete";
        public var currentTragetURL:URLRequest;
        public var content:*;
        public var isSuccess:Boolean
        public function LoadLineEvent(type:String,URL:URLRequest,content,isSuccess:Boolean = true, bubbles:Boolean=true, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);
            this.currentTragetURL = URL;
            this.isSuccess = isSuccess;
            this.content = content;
        }
        
    }
}
自定義加載過程中的事件類
LoadLineProgressEvent.as
複製內容到剪貼板
代碼:
package com.FSC.UI.InterActiveObject.DisplayObjectContainer.LoadLine
{
    import Flash.events.ProgressEvent;
    import Flash.net.URLRequest;
    public class LoadLineProgressEvent extends ProgressEvent
    {
        public var currentTragetURL:URLRequest;
        public function LoadLineProgressEvent(type:String,URL:URLRequest, bubbles:Boolean=false, cancelable:Boolean=false, bytesLoaded:uint=0.0, bytesTotal:uint=0.0)
        {
            super(type, bubbles, cancelable, bytesLoaded, bytesTotal);
            this.currentTragetURL = URL;
        }
        
    }
}
使用方法如下:
import com.FSC.UI.InterActiveObject.DisplayObjectContainer.LoadLine.*;
var l:LoadLine = LoadLine.getInstance();
l.addEventListener(LoadLineEvent.ONLOADLINECOMPLETE,onComplete);
l.addEventListener(ProgressEvent.PROGRESS,onProgress);
//插入可用的url
l.loadFile(new URLRequest("http://static16.photo.sina.com.cn/bmiddle/54a5adcd44b992988febf"));
//插入錯誤的url
l.loadFile(new URLRequest("http://error.error.cn/error.htm"));
//插入可用的url
l.loadFile(new URLRequest("http://static3.photo.sina.com.cn/bmiddle/54a5adcd44b9926c6faf2"));
//插入可用的url 這裏插入緊急級別爲0(就是最高級別的)的URL 程序會停止當前下載過程,然後執行該下載
l.loadFile(new URLRequest("https://mail.google.com/mail/help/images/logo.gif"),0);

function onComplete(e:LoadLineEvent) {
       trace(e.currentTragetURL.url);
       if (e.isSuccess && e.currentTragetURL.url =="http://static16.photo.sina.com.cn/bmiddle/54a5adcd44b992988febf") {
              var bbb:* = e.content;
              bbb.y=0;
              addChild(bbb);
       }
}
function onProgress(event:LoadLineProgressEvent) {
       trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章