从2011年开始使用这段代码为了应对各种加载修修改改了这么多年,很基础的功能,没啥特别的,重点在于加载子swf获取它的类,还有就是卸载子swf时要清理内存,否则内存占用会节节窜高,内存溢出,所以加载新swf文件时要提前 .clear(); 没啥特别的,重点是loader.unloadAndStop(); loader.unload(); 不过注意的是音视频文件是清理不掉的,需要在子swf里写脱离场景侦听进行卸载音视频各类监听事件。

加载进来的文件默认是子域,ApplicationDomain分子域、共享域、封装域,三个的区别就不详细赘述了。

ClassLoader.as :

package cn.flashme.loading{
/*
================================================================================《加载SWF文件Loading...》来源网络
------------------------------------------------------------
Copyright (c) 2011 [无空]My web:闪耀空间http://www.flashme.cn/
E-mail:flashme@live.cn2011-11-18
================================================================================构造函数:public function ClassLoader(obj:Object = null,lc:LoaderContext = null)
参数1可以是字符串,可以是ByteArray,如果为前者则采用load方法Methods,后者采用loadBytes方法Methods
参数2是创建带有指定 LoaderContext 对象得ClassLoader实例,LoaderContext 可以设置是否加载跨域文件,应用程序域等,详见官方LoaderContext类讲解!load 方法Methods:public function load(_url:String,lc:LoaderContext = null):void
加载文件
参数1是加载地址,参数2见构造函数loadBytes 方法Methodspublic function loadBytes(bytes:ByteArray,lc:LoaderContext = null):void
加载字节文件
参数1是字节数据,参数2见构造函数getClass 方法Methodspublic function getClass(className:String):Object
获取一个公共定义,可以是类,也可以是命名空间或者函数定义
参数1是获取class得完整包加类名,例如偶们得这个类完整定义名称是 index.base.net.ClassLoader
详见例子hasClass 方法Methods:public function hasClass(className:String):Boolean
返回是否含有该公共定义
参数1见getClass方法Methodsclear 方法Methodspublic function clear():void
清空url 属性:public var url:String
获取url属性loader 属性:public var loader:Loader
获取loader属性例子1:一个虚拟人物形象得动作包,其中包含了8种不同得动作
在使用ClassLoader加载这个swf得动作包后,即可使用getClass来调用这些素材,并且可以重复得new这些元件,来达到多次重复使用例子2:
将设偶有一个类库,有这么三个类然后把它编译成swf----------------------------------------------示例:一:import cn.flashme.loading.ClassLoader;   var cl:ClassLoader = new ClassLoader;
cl.load("main.swf");   cl.addEventListener(Event.COMPLETE,fun);
function fun(e:Event){  var tmp1 = cl.getClass("index.base.net.ByteLoader");  trace(tmp1)  var tmp2 = cl.getClass("index.base.net.ClassLoader");  trace(tmp2)  var tmp3 = cl.getClass("index.base.geom.Dot");  trace(tmp3)
}   * trace得结果: * [class ByteLoader] * [class ClassLoader] * [class Dot] 二:import cn.flashme.loading.ClassLoader;  var cl:ClassLoader = new ClassLoader;
cl.load("main.swf");   cl.addEventListener(Event.COMPLETE,fun);
function fun(e:Event){  var tmp = cl.getClass("drag");  addChild(new tmp);
}   */import flash.display.Loader;import flash.net.URLRequest;import flash.utils.ByteArray;import flash.events.Event;import flash.events.ProgressEvent;import flash.events.EventDispatcher;import flash.events.IOErrorEvent;import flash.system.LoaderContext;public class ClassLoader extends EventDispatcher {public var url:String;public var loader:Loader;public var id:String;//构造函数public function ClassLoader(obj:Object=null,lc:LoaderContext=null) {if (obj!=null) {if (obj is ByteArray) {loadBytes(obj as ByteArray,lc);} else if (obj is String) {load(obj as String,lc);} else {throw new Error("参数错误,构造函数第一参数只接受ByteArray或String");}}}//加载public function load(_url:String,lc:LoaderContext=null):void {url=_url;loader=new Loader  ;loader.load(new URLRequest(url),lc);addEvent();}//加载字节public function loadBytes(bytes:ByteArray,lc:LoaderContext=null):void {loader=new Loader  ;loader.loadBytes(bytes,lc);addEvent();}//开始侦听private function addEvent():void {loader.contentLoaderInfo.addEventListener(Event.OPEN,openFun);loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,progressFun);loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeFun);loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,errorFun);}//结束侦听private function delEvent():void {loader.contentLoaderInfo.removeEventListener(Event.OPEN,openFun);loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS,progressFun);loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,completeFun);loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,errorFun);}//加载开始private function openFun(e:Event):void {dispatchEvent(e);}//加载成功,发布成功事件private function completeFun(e:Event):void {delEvent();dispatchEvent(e);}//加载过程private function progressFun(e:ProgressEvent):void {dispatchEvent(e);}//加载失败private function errorFun(e:IOErrorEvent):void {delEvent();dispatchEvent(e);}//获取定义public function getClass(className:String):Object {return loader.contentLoaderInfo.applicationDomain.getDefinition(className);}//是否含有该定义public function hasClass(className:String):Boolean {return loader.contentLoaderInfo.applicationDomain.hasDefinition(className);}//清除public function clear():void {if(loader){delEvent();loader.unloadAndStop();//卸载子swf 以及内部的事件侦听移除 关闭流loader.unload();loader=null;}}}
}

后期又自己扩展了个队列加载,那时候做了个电子书,100多张图片不可能同时加载,会慢死,所以要从第一页开始向后加载,而两张两张的同时加载是效率最高的,不传数值的话默认是2张同时加载。

功能包含按id提取对象文件,按数目提取,按id或数目清除特定文件,及清理所有对象文件

LoadAll.as :

package cn.flashme.loading{
/*
================================================================================《多文件队列加载》支持文件:jpg/png/gif/bmp/swf
ClassLoader基础上的队列加载,不需要时可及时清理对象,清理swf对象基本上完美垃圾回收,特殊对象如声音仍需手动在被加载flash里执行卸载清理!------------返回侦听:
全部加载完毕的侦听是"onCompleteAll"
加载进程中的侦听是"onProgressAll"
加载比率调用Rate
单独文件加载侦听可外部ClassLoader定义,也可LoadAll内get函数调用ClassLoader定义------------注:
正反排序true优先级是数字越小越优先,false是数字越大越优先,id推荐是唯一的值。
若有多个相同地址文件,而后需要调用,建议赋予id。------------方法:
//(同时加载进程,正反排序)推荐同时加载为2会下载快些
var LoadQueue:LoadAll=new LoadAll(2,false);
//(地址,ClassLoader,唯一id,优先级,加载域)
LoadQueue.addLoad("pic1.png",null,0);
LoadQueue.addLoad("main.swf",null,1,0,new LoaderContext(false,ApplicationDomain.currentDomain));
LoadQueue.addLoad("pic2.jpg",null,2,1);
LoadQueue.Start();
------------------------------------------------------------
Copyright (c) 2012 [无空]My web:闪耀互动http://www.flashme.cn/
E-mail:flashme@live.cn2012-12-10
================================================================================
*///import flash.display.Loader;//import flash.net.URLRequest;import flash.events.Event;import flash.events.ProgressEvent;import flash.events.EventDispatcher;import flash.events.IOErrorEvent;import flash.system.LoaderContext;import cn.flashme.loading.ClassLoader;public class LoadAll extends EventDispatcher {//加载队列数组public var Queue:Array=[];//加载比率public var Rate:Number;//加载完成的数量private var loadNum:uint;//正序排列或倒序排列private var turn:Boolean;//同时加载进程数量private var same:uint;//最新加载数值位置private var nowNum:uint;//加载进程结束的数量private var overNum:uint;public function LoadAll(num:uint=2,_turn:Boolean=true):void {same = num;turn = _turn;}//(地址,ClassLoader,优先级,唯一id,加载域)public function addLoad(url:String,_loader:ClassLoader=null,id:String="",pr:int=0,lc:LoaderContext=null):void {var loader:ClassLoader;if(_loader){loader = _loader;}else{loader = new ClassLoader();}loader.id=id;Queue.push({Loader:loader,Url:url,Pr:pr,Lc:lc});}//加载队列开始public function Start():void {Sort();same=same>Queue.length?Queue.length:same;nowNum=same-1;for(var i:uint=0;i<same;i++){Queue[i].Loader.load(Queue[i].Url,Queue[i].Lc);Queue[i].Loader.addEventListener(ProgressEvent.PROGRESS,onProgressLoader);Queue[i].Loader.addEventListener(IOErrorEvent.IO_ERROR,onErrorLoader);Queue[i].Loader.addEventListener(Event.COMPLETE,onCompleteLoader);}}//用文件地址来获取,若有相同文件,只读取排在后面的!public function getUrl(str:String):ClassLoader {for (var i:int = Queue.length - 1; i >= 0; i--) {if(Queue[i].Url==str){return Queue[i].Loader;}}return null;}//用ID来获取,若有相同文件,只读取排在后面的!public function getId(str:String):ClassLoader {for (var i:int = Queue.length - 1; i >= 0; i--) {if(Queue[i].Loader.id==str){return Queue[i].Loader;}}return null;}//获取排序public function getOrder(loader:ClassLoader):int {for(var k in Queue){if(Queue[k].Loader==loader){return k;}}return -1;}//按文件地址清除文件,若有相同文件,都会被执行清除!public function clearUrl(str:String):Boolean {var boo:Boolean=false;for (var i:int = Queue.length - 1; i >= 0; i--) {if(Queue[i].Url==str){Queue[i].Loader.clear();Queue[i].Loader=null;Queue.splice(i,1);boo=true;}}return boo;}//按id清除文件,有相同id只清除最后一个public function clearId(str:String):Boolean {for (var i:int = Queue.length - 1; i >= 0; i--) {if(Queue[i].Loader.id==str){Queue[i].Loader.clear();Queue[i].Loader=null;Queue.splice(i,1);return true;}}return false;}//清除所有加载对象public function clearAll():void {for(var k in Queue){Queue[k].Loader.clear();Queue[k].Loader=null;}Queue=null;Queue=[];}//加载侦听:private function onProgressLoader(e:ProgressEvent):void {var percent:Number=(e.bytesLoaded/e.bytesTotal)/Queue.length;Rate=(loadNum+percent)/Queue.length;dispatchEvent(new Event("onProgressAll"));}private function onCompleteLoader(e:Event):void{trace("完成一个")loadNum++;e.target.removeEventListener(IOErrorEvent.IO_ERROR,onErrorLoader);e.target.removeEventListener(Event.COMPLETE,onCompleteLoader);e.target.removeEventListener(ProgressEvent.PROGRESS,onProgressLoader);nextLoad();}private function onErrorLoader(e:IOErrorEvent):void{trace("错误一个",e)loadNum++;e.target.removeEventListener(IOErrorEvent.IO_ERROR,onErrorLoader);e.target.removeEventListener(Event.COMPLETE,onCompleteLoader);e.target.removeEventListener(ProgressEvent.PROGRESS,onProgressLoader);nextLoad();}private function nextLoad():void {if(nowNum<Queue.length-1){nowNum++;}else{overNum++;if(overNum==same){trace("全部加在完毕")Rate=1;dispatchEvent(new Event("onCompleteAll"));}return;}Queue[nowNum].Loader.load(Queue[nowNum].Url,Queue[nowNum].Lc);Queue[nowNum].Loader.addEventListener(IOErrorEvent.IO_ERROR,onErrorLoader);Queue[nowNum].Loader.addEventListener(Event.COMPLETE,onCompleteLoader);Queue[nowNum].Loader.addEventListener(ProgressEvent.PROGRESS,onProgressLoader);}//数组冒泡排序,Pr对比排列private function Sort():void {var temp:Object;for (var i:uint=0; i<Queue.length; i++) {for (var j:uint=Queue.length-1; j > i; j--) {if (turn==true ? Queue[j - 1].Pr > Queue[j].Pr : Queue[j - 1].Pr < Queue[j].Pr) {temp = Queue[j - 1];Queue[j - 1] = Queue[j];Queue[j] = temp;}}}}}}

flash AS3 Loader加载外部文件类 及队列加载方法相关推荐

  1. FPGA加载bit文件可以工作,加载mcs不能工作的原因

    FPGA加载bit文件可以工作,加载mcs不能工作的原因 1: 使用ISE的MPACT用bit文件生成mcs的时候设置错了应该,检查一下FLASH型号,容量,位宽都有没有选对. 2: mcs文件的大小 ...

  2. cad2006激活未找到html文件,解决cad提示“cad加载自定义文件失败 未找到acad”的方法...

    下图所示的提示界面大家是不是觉得很熟悉呢?这个错误提示是出现在autocad程序中的错误之一.相比无法安装等情况这个故障的解决方法比较简单,首先我们来看看具体故障:有用户在双击打开Autocad的时候 ...

  3. 初识AS3(十)——加载外部文件进度…

    =================外部图片或swf加载进度=================== CODE: //加载外部图片jpg(gif)或影片swf var url:String = " ...

  4. springboot 启动分析【难点】——如何自动扫描 @SpringBootApplication||如何加载自动配置类 @EnableAutoConfiguration||如何加载前端控制器

    springboot 启动分析[难点] 自动扫描的特点 默认扫描与 启动类 同级的所有包及其子包都可以自动扫描 如果不可要使用@ComponentScan(basePackage={"&qu ...

  5. java getname_Java文件类字符串getName()方法(带示例)

    java getname 文件类字符串getName() (File Class String getName()) This method is available in package java. ...

  6. Java文件类boolean canExecute()方法(带示例)

    文件类boolean canExecute() (File Class boolean canExecute()) This method is available in package java.i ...

  7. Java文件类字符串getAbsolutePath()方法(带示例)

    文件类字符串getAbsolutePath() (File Class String getAbsolutePath()) This method is available in package ja ...

  8. getparent_Java文件类字符串getParent()方法(带示例)

    getparent 文件类字符串getParent() (File Class String getParent()) This method is available in package java ...

  9. Java文件类boolean isHidden()方法(带示例)

    文件类boolean isHidden() (File Class boolean isHidden()) This method is available in package java.io.Fi ...

最新文章

  1. jquery checkbox勾选/取消勾选的诡异问题
  2. debian7更换gcc版本的二种方法分享
  3. Blackhat兵器谱新添IOT安全武器 低配置也能高性能运行
  4. mysql事务实战_MySQL - 实战 (2) - 事务隔离
  5. springboot(七) 配置嵌入式Servlet容器
  6. Orbeon form 的安装和使用教程
  7. libwacom9 : Depends: libwacom-common (= 2.2.0-1) but 1.12-1 is to be installed
  8. 面试题:二叉树中和为某一路径
  9. [导入]网易娱乐频道也在用风讯CMS
  10. postfix邮件服务器
  11. Redis集群的原理和搭建
  12. 2016年1月书单推荐
  13. Nested组件,解决Flutter布局嵌套过深的利器
  14. 郑大计算机组成原理(专科)试卷 答案,专科《数字电路与逻辑设计》
  15. 环境试验之模拟运输试验
  16. Java初级程序员面试中应该如何准备?一般公司对Java开发的要求有哪些?
  17. qt4谷歌输入法 linux,linux mint设置google pinyin输入法
  18. jquery 手型 鼠标穿过时_css各种手型集合(css禁止手型)-Fun言
  19. “心”苦不“辛”苦 (7.26)
  20. unhandled system error, NCCL version 2.7.8

热门文章

  1. 电脑备忘录软件测试,桌面备忘录软件哪个好?2020电脑备忘录软件推荐
  2. 河北师范大学汇华学院计算机类,河北师范大学汇华学院
  3. 《现代职业教育》杂志正规吗?现代职业教育杂志社现代职业教育编辑部投稿要求
  4. HTA程序:VBS/JS脚本GUI
  5. 题解 洛谷P1365 WJMZBMR打osu! / Easy
  6. win 7下ffmpeg平台和Android联合编译ndk rc7和ffmpeg harmony(最后还是改为r5)
  7. Flarum 宝塔完美迁移教程
  8. 银河麒麟V10系统 syslog和kern.log文件过大问题解决,定时清理日志文件
  9. 赛灵思宣布收购深鉴科技
  10. Android Activity 滑动返回。支持微信滑动返回样式、横屏滑动返回、全屏滑动返回