2012-12-06 247 views
3

我需要一些關於這個問題的澄清,因爲我剛剛遇到加載到重用的加載器對象的swfs問題。
ApplicationDomain澄清需要

因此可以說我有3個SWF。
的main.swf
childA.swf
childB.swf

的main.swf中有一個裝載機對象得到重用(myloader.load( 「childA.swf」))和childA或childB SWF將通過用戶交互加載。
這兩個子swfs都有一個com包​​,該包中包含一個名爲config的包。
配置文件對於剛剛命名的兩個類都是不同的文件。
兩個孩子也SWF派遣的主要監聽

現在我有問題,如果childA首次再經過childB加載它仍然會顯示爲childA加載的事件。基本上,無論哪個人首先裝載到裝載機上都將成爲贏家。
這使我瘋狂,因爲我所做的一切都不會導致swf卸載。直到我找到下面的代碼。

var appDomain:ApplicationDomain = new ApplicationDomain(); 
var context:LoaderContext = new LoaderContext(false, appDomain); 
_contentPanel.load(new URLRequest(str), context); 

我偶然發現了這段代碼的某處談到如何真正的卸載一個swf後。顯然,這也適用於如何真正加載swf。
正如你所看到的,一個新的appDomain被創建並在加載時被分配給上下文。
這就像我現在可以整天加載和卸載的夢一樣。

我的困惑是孩子發送的事件仍然有效,當我不認爲主SWF應該接受它,因爲它不在同一個appDomain中。
我的意思是不應該阻止事件?

回答

2

卸載SWF

Loader類提供Loader.unload()(或Flash播放器VERS 10後 - Loader.unloadAndStop()

問題與第二加載的SWF由第一

重寫存儲在ApplicationDomain中的對象以其類名存儲,我不知道所加載的SWF(或其子項)的類名是否重寫。即使情況並非如此;爲什麼不爲加載的每個對象使用Loader的新實例?

如何主SWF可以從另一個應用程序域

主SWF去接兩個孩子將能夠因爲他們的主要SWF的子域與新(加載)應用領域的工作(請參閱ApplicationDomain.parentDomain)。主SWF的域將是'系統域',新實例將被加載到它下面。

拆分從Loader

加載的主權財富基金在理想情況下,你要訪問的SWF數據無關的Loader的狀態。您可以通過訪問一次加載的SWF的根動畫片段做到這一點,與

var rootClipClass:Class = ApplicationDomain.getDefinition("[InsertYourRootClipName]") as Class; 
var rootClip:MovieClip = new rootClipClass(); 

創建一個新的實例在這一點上,你可以卸載裝載機和乾淨你的新鮮實例工作。

延伸閱讀

+0

唉唉, 「因爲他們是孩子域」 這是我失蹤的關鍵。 –

+0

哦,只是需要注意。我隱約記得大約3年前閱讀過一些內容,說運行時會將應用程序域添加到包中。因爲這是很久以前的事情,所以不要引用我的話,那時我沒有付出任何努力。 –