------------------------------------------------
前幾天應徵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);
}