用户名: 密码: 验证码: QQ--程序群:31736530 动画群:38836599
闪无忧
 
首 页 业界新闻 业界杂谈 Flash教程 Flash源码 Flash图书 Flash酷站 Flex & AIR 供求信息
   本栏目通告:   有意向写收费精品教程的朋友,请联系本站合作
当前位置 :首页>flash教程>Flash as3.0教程>列表

AS3.0 下载队列类 帮助完成Flash队列下载

[来源: | 作者: | 时间:2008-05-10 | 点击:  | 收藏本文  【 】]
多次试验发现队列下载效率真的不太好。还是扩展一个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);
}

 

附件

eg.rar

详细讨论见蓝色理想帖子

http://bbs.blueidea.com/thread-2852727-1-1.html

文章如果有错误或者缺少文件,请发邮件提交给我们
上一篇:as3游戏开发之打气球系列(二)
下一篇:我对as3声音架构的理解
Tags:    
>>> 最新评论:(共有 0 位网友发表了评论)      查看所有评论
  发表评论
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
·本站发布内容均为客观表达作者观点,不代表闪无忧立场,请勿攻击和漫骂
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
  教程分类
  基础操作   动画特效
  应用开发   组件学习
  As程序   动画教程
  Flash cs3   AS 3.0
  FCS/FMS教程   Loading教程
  Flash与Web   Flash教程连载
  相关文章
·flash【.swf?id=】很简单的获取
·AS3.0 单一职责原则设计模式
·as3打造一个非常酷的莲花曲线效
·AS3制作MP3波形图
·AS3的网页参数处理
·flash地图游戏说明如何结合AS3.0
·2/8/10/16/32进制AS3自带函数进
·as3实现点击图片取色
·flash as3+php上传源文件下载
·TransformManager (AS3) - Inter
  热门文章
·Flash进度条的制作详细讲解(组图)
·flash幻灯片网页效果
·Flex 3 AdvancedDataGrid的使用(第二
·全Flash动画网站实现的基础教学
·flash水影效果字
·Flash打造简单的飘雪动画视觉特效
·FLASH+XML相册(附源码)
·超酷flash光晕移动效果
·Flash旋转拖尾文字效果的制作教程
·Flash制作大雪纷飞效果动画
·flash春雷闪电效果
关于我们 - 免责声明 - 网站地图 - 商务服务 - 联系我们 - RSS地图
©CopyRight 2006-2008, 5UFlash.COM, Inc. All Rights Reserved
鲁ICP备06034971号