flash AS3 Loader載入外部檔案類 及佇列載入方法
從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:
[email protected] 2011-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 方法Methods public function loadBytes(bytes:ByteArray,lc:LoaderContext = null):void 載入位元組檔案 引數1是位元組資料,引數2見建構函式 getClass 方法Methods public function getClass(className:String):Object 獲取一個公共定義,可以是類,也可以是名稱空間或者函式定義 引數1是獲取class得完整包加類名,例如偶們得這個類完整定義名稱是 index.base.net.ClassLoader 詳見例子 hasClass 方法Methods: public function hasClass(className:String):Boolean 返回是否含有該公共定義 引數1見getClass方法Methods clear 方法Methods public 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:
[email protected]
2012-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載入外部檔案類 及佇列載入方法
從2011年開始使用這段程式碼為了應對各種載入修修改改了這麼多年,很基礎的功能,沒啥特別的,重點在於載入子swf獲取它的類,還有就是解除安裝子swf時要清理記憶體,否則記憶體佔用會節節竄高,記憶體溢位,所以載入新swf檔案時要提前 .clear(); 沒啥特別的,重點是loa
java載入class檔案(類載入機制)
一概述:在編譯期,所有的*.java檔案被編譯成.class檔案。在執行期,class檔案只有被載入到jvm記憶體中才能執行。這個裝載工作是由類裝載器完成的。實質就是把class檔案從硬碟讀取到記憶體中,並對資料進行校驗,轉化解析和初始化,最終形成可以被jvm直接使用的ja
spring 配置載入外部檔案的兩種方式
第一種: <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlac
2018-10-09 泛型類及泛型方法
通過引數化型別來實現在同一份程式碼上操作多種資料型別,利用“引數化型別”將型別抽象化,從而實現靈活的複用。 泛型類: 定義一個類,如果這個類中某些欄位的型別是不確定的,這些型別可以在類構造的時候確定下來。 class ClassA<T> {
Python類及常見的方法屬性定義
Python類及常見的方法屬性定義 Python是一門完全面向物件(OOP)的語言,對於Python來說,一切皆物件, 一切皆物件, 貓,老虎,狗,狼這些都是我們認識的一種動物,在現實生活中我們把它叫做動物,而在面向物件的程式語言(OOP)中我們稱這類在生活中的具體事物叫做物件
String類及相關各種方法
String類 String類的兩種例項化方式 字串相等比較 解釋String類“==”與“equals”的區別 String類兩種例項化區別 字串常量不可變更
php中類外部訪問類私有屬性的方法
我們都知道,類的私有屬性在類外部是不可訪問的,包括子類中也是不可訪問的。比如如下程式碼: <?php class Example1{ private $_prop = 'test'; } $r = function(Example1 $e){
聊聊Android影象格式類及影象轉換方法
本文主要介紹Android影象格式類及影象轉換方法,一款軟體的開發和影象密切相關,特別是移動應用程式,在視覺效果、使用者的體驗效果等方面是至關重要的,在Android程式開發的過程中,瞭解存在哪些影象
Flash AS3.0載入外部資源(圖片、MP3、SWF)的兩種方式
關於AS3載入圖片等外部自言,大部分人常用的有兩種方式:Loader 和Embed ,各自的特點,總結如下: Embed :在Flash編譯階段就將資源嵌入,也就是說圖片資源是會被編譯進swf檔案裡面去的;這樣子的好處是程式碼比較簡潔,使用方便,也不存在載入順序的問題,缺點
教你如何在FLASH中載入外部SWF檔案
方法很簡單,但是卻相當實用,比如做一個flash全站,需要按功能將網站分解成多個flash,然後利用本例中的原理,通過一個首頁flash呼叫其他各個頁面的flash檔案即可實現。本例為基礎示例,可以根據需要進行擴充套件,關鍵是要學會變通,將其變為自己的東西。 實現方法: 1
運用URLClassLoader載入外部jar包的java類,生成Class檔案
先來一段網上copy的話術: //**************************** 很多時候 我們寫的java程式是分模組的,有很好的擴充套件機制,即我們可以為我們自己的java類新增外掛,來執行將來某天我們可能開發出來的類,以下稱這些
springboot按profile載入配置檔案放入靜態類
import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spri
LINUX學習—檔案系統及管理類命令
Windows: PE Linux: ELF 檔案系統: rootfs:根檔案系統 FHS:規定Linux應該建立哪些目錄和檔案 ls / 可檢視根目錄下一級子目錄, 也可以ls /目錄名:可以檢視該目錄下一級子目錄 /boot: 系統啟動相關的檔案, 如核心、initrd
wlh- beagle bone 通過uboot tftp 載入zImage 裝置樹 及 nfs 掛載根檔案系統
首先重啟Ubuntu 伺服器的 tftp 和nfs sudo /etc/init.d/xinetd restart 命令 重啟 xinetd tftp服務 sudo&nbs
JDK類載入機制原始碼分析及原始碼分析
JVM的類載入機制主要有如下三種機制: 1.全盤負責:所謂全盤負責,就是說當一個類載入器載入個個Class的時候,該Class所依賴和引用的其他Class也將由該類載入 器負責載入,除非使用另外一個類載入器來載入。 2.雙親委託:所謂雙親委託則是先讓parent(父)類載入器
使用MyEclipse自動生成Hibernate對映檔案和VO類及無主鍵生成2個VO類的問題
----使用MyEclipse自動生成Hibernate對映檔案和VO類及無主鍵生成2個VO類的問題 ----MyEclipse 10 1.切換MyEclipse Database Explorer環境,new一個Driver,以Oracle資料庫舉例,在完善資訊並引入j
java動態載入指定的類或者jar包反射呼叫其方法-涉及其他jar中的類就報ClassNotFound問題分析及解決思路
在這篇博文中java動態載入指定的類或者jar包反射呼叫其方法,介紹動態載入指定的類,當時我是拿URLClassLoader介紹的,當然可以自定義一個ClassLoader重寫對應的方
Spring+Data+JPA持久層的使用及注意事項(三)——Failed to load ApplicationContext無法載入配置檔案
Failed to load ApplicationContext這個問題是有很多的,我的檢查過程是這樣:1,檢查web.xml中對於spring的listener的配置是否有問題,因為我這是一鍵生成的,所以主要是看路徑問題,也就是location有沒有配對 <!
Ext4.2.1學習歷程之二:自定義類及類的動態載入
原文出處 http://blog.itpub.net/28562677/viewspace-1067421/ -------------------------------------------------------------- 在些extjs類的定義時有必要簡單
c# 異常檔案中的類都不能進行設計,因此未能為該檔案顯示設計器。設計器檢查出檔案中有以下類: FormMain --- 未能載入基類
出現該問題的原因:FormMain從FormMainBase繼承之後,一旦修改FormMainBase就會出現這個問題解決方案:(1-4是搜尋網友的) 1: 關閉VS所有視窗,後重啟.即可返回正常. 2: 第一種方案不成功,關閉VS所有視窗,點選解決方案->清理解決