應用程式定義域實現情境模組化載入

來源:互聯網
上載者:User

applicationDomain-------as3的一個類,或者可以稱作是一種技術和概念。利用該技術可以簡便地實現調用伺服器端的swf,並且使用該swf中的方法和變數。

 

這幾天接觸flex的通訊技術,越發覺得老是處於一些表面的應用。對整個虛擬機器怎麼跑一個swf,以及一些內部機制都不甚瞭解。語言可以人為地封裝得很強大,但卻使使用者失去控制的自由。就好象它自己弄了個記憶體回收管理,我就不信C++的手工回收會遜色於自動回收,把控制權放在一堆未知的代碼上面,況且解決記憶體的問題的代碼量也沒少過C++的人工釋放。

 

其實跑到了一些底層,flex和C++的區別也就是語言的規則不同,架構模式,資料結構,思想那些都是相似的。

 

上一小段程式中的代碼:

 

雖然直接上代碼不怎麼好習慣,但是不上不踏實。因為對應用程式定義域,安全沙箱,等概念的理解仍然非常抽象。還得多寫寫代碼

 

package com.works.packages<br />{<br /> import flash.display.DisplayObject;<br /> import flash.display.Sprite;<br /> import flash.errors.IllegalOperationError;<br /> import flash.events.Event;</p><p> public class LoadSwf extends Sprite<br /> {<br /> private var loader:ClassLoader;<br />private var _inswf: Object;<br />private var _sencename: String;<br />private var targetclass: String;//程式域中要調用的類<br />private var recvend: Function;//調用外部回呼函數<br />private var runtimeClassRef:Class;</p><p> /**<br /> *<br /> * @param str<br /> * @param myclass<br /> * @param callback 傳進父域的函數,供下載完調用<br /> *<br /> */<br /> public function LoadSwf(str: String, myclass: String, callback: Function)<br /> {<br /> trace("loader " + str);<br /> // addChild(tf);<br /> targetclass = myclass;<br /> recvend = callback;</p><p> loader = new ClassLoader();<br /> loader.addEventListener(ClassLoader.LOAD_ERROR,loadErrorHandler);<br /> loader.addEventListener(ClassLoader.CLASS_LOADED,classLoadedHandler);<br /> loader.load(str);<br /> }</p><p> /**<br /> * 擷取swf執行個體<br /> * @return<br /> *<br /> */<br /> public function get swfObject(): DisplayObject<br /> {<br /> return DisplayObject(_inswf);<br /> }</p><p> /**<br /> * 獲得下一情境名字<br /> * @return<br /> *<br /> */<br /> public function get senceName(): String<br /> {<br /> return _sencename;<br /> }</p><p> /**<br /> * 下載swf<br /> * @param str swf檔案名稱<br /> *<br /> */<br /> public function loadSwf(str: String): void<br /> {<br /> loader.load(str);<br /> }</p><p>/**<br /> * 下載報錯<br /> * @return<br /> *<br /> */<br /> private function loadErrorHandler(e:Event):void<br /> {<br /> throw new IllegalOperationError("Cannot load the specified file.");<br /> }</p><p>/**<br /> * 下載完畢<br /> * @return<br /> *<br /> */<br /> private function classLoadedHandler(e:Event):void<br /> {<br /> runtimeClassRef = loader.getClass(targetclass);<br /> _inswf = new runtimeClassRef();<br /> trace("_inswf " + _inswf.toString());<br /> enterLocal(targetclass);<br /> this.addChild(DisplayObject(_inswf));<br />_inswf.addEventListener(MyEvent.CHANGE, fun);<br /> }</p><p> /**<br /> * 擷取當前情境名<br /> * @param e<br /> *<br /> */<br /> private function fun(e: MyEvent): void<br /> {<br /> trace("fun" + e.target.toString());<br /> _sencename = e.getsence();<br /> recvend();<br /> }</p><p> public function releaseOutLocal(str: String): void<br /> {<br /> //_inswf.releaseOutLocal(str);<br /> _inswf.releaseOutLocal(str);<br /> }</p><p> public function releaseOutNext(str: String): void<br /> {<br /> _inswf.releaseOutNext(str);<br /> }</p><p> public function enterLocal(str: String): void<br /> {<br /> trace("enterlocl "+ _inswf.toString());</p><p> _inswf.enterLocal(str);<br /> }<br /> }<br />}</p><p>import flash.display.Loader;<br />import flash.errors.IllegalOperationError;<br />import flash.events.Event;<br />import flash.events.EventDispatcher;<br />import flash.events.IOErrorEvent;<br />import flash.events.SecurityErrorEvent;<br />import flash.net.URLRequest;<br />import flash.system.ApplicationDomain;<br />import flash.system.LoaderContext;</p><p>/**<br /> * 把Load進來的swf載入到主swf的應用程式定義域中<br /> * @author Administrator<br /> *<br /> */<br />class ClassLoader extends EventDispatcher<br />{<br /> public static var CLASS_LOADED:String = "classLoaded";//自訂訊息類型<br /> public static var LOAD_ERROR:String = "loadError";</p><p> private var loader:Loader;<br /> private var swfLib:String;<br /> private var request:URLRequest;<br /> private var loadedClass:Class;</p><p> public function ClassLoader()<br /> {<br /> loader = new Loader();<br /> loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);<br /> loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);<br /> loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);<br /> }</p><p> /**<br /> * Load進相應的swf<br /> * @param lib swf路徑<br /> *<br /> */<br /> public function load(lib:String):void<br /> {<br /> swfLib = lib;<br /> request = new URLRequest(swfLib);<br /> var context:LoaderContext = new LoaderContext();<br /> context.applicationDomain=ApplicationDomain.currentDomain;<br /> loader.load(request,context);<br /> }</p><p> /**<br /> * 擷取該域中的指定類<br /> * @param className<br /> * @return<br /> *<br /> */<br /> public function getClass(className:String):Class<br /> {<br /> try<br /> {<br /> return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;<br /> }<br /> catch (e:Error)<br /> {<br /> throw new IllegalOperationError(className + " definition not found in " + swfLib);<br /> }<br /> return null;<br /> }</p><p> private function completeHandler(e:Event):void<br /> {<br /> trace("loaded "+ e.target.toString());<br /> dispatchEvent(new Event(ClassLoader.CLASS_LOADED));<br /> }</p><p> private function ioErrorHandler(e:Event):void<br /> {<br /> dispatchEvent(new Event(ClassLoader.LOAD_ERROR));<br /> }</p><p> private function securityErrorHandler(e:Event):void<br /> {<br /> dispatchEvent(new Event(ClassLoader.LOAD_ERROR));<br /> }<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.