1. 程式人生 > >flash AS3 Loader載入外部檔案類 及佇列載入方法

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所有視窗,點選解決方案->清理解決