2008-09-22 114 views
3

我有一個應用程序加載外部SWF文件,並通過SWFLoader Flex component在Adobe Flex/Air應用程序中播放它們。我一直在試圖找到一種方法來從按鈕點擊事件中卸載它們。我有Google,而且沒有人能夠在沒有黑客的情況下做到這一點。我看到人們使用的代碼組合是:如何從Adobe Flex中的SWFLoader組件卸載外部加載的SWF文件?

swfLoader.source = ""; // Removes the external link to the SWF. 
swfLoader.load(null); // Forces the loader to try to load nothing. 
// Note: At this point sound from the SWF is still playing, and 
// seems to still be playing in memory. 
flash.media.SoundMixer.stopAll(); 
// Stops the sound. This works on my development machine, but not 
// on the client's. 

如果SWFs以這種方式關閉(隱藏),最終程序崩潰。

任何想法?我在各種論壇上發現了大量的帖子,人們遇到同樣的問題。我認爲我會在這裏得到一個錯誤/不完整的答案,並且比我的帖子會像往常一樣陷入虛無,但無論如何,都要提前致謝!

編輯1:我無法編輯實際的SWF電影,它們是由客戶端創建的。如果我無法關閉通過Flex打開的任何SWF,那麼對Flex架構來說這不是問題嗎?我唯一的選擇是將SWF發送到網絡瀏覽器嗎?

+0

編輯:好像有閃光的錯誤9.希望現在修復:D – Shawn 2008-11-01 20:00:59

回答

6

...這不是Flex體系結構的問題嗎?

是的,它也影響一般的Flash。在您可以利用FP10(AIR 1.5)中的Loader.unloadAndStop()方法之前,即使您使用Loader.unload()方法,也不能保證外部加載的內容不會繼續佔用內存和cpu資源。 (說實話,我不是100%確定,即使這樣也能保證資源的釋放,但也許我是個悲觀主義者。)

下一個最好的事情是讓你堅持讓你的內容創作者負載遵循一套指導原則,包括公開您的應用可以調用的方法,例如dispose()方法,要求它在您unload()之前釋放盡可能多的資源。如果這不可行,那麼每次加載外部swf時,應用程序幾乎肯定會在內存和CPU使用率上膨脹。抱歉。

如果它讓你感覺更好,那麼你並不孤單。 ;)

+0

實際上Loader.unloadAndStop()失敗後發現這篇文章。看不到希望! – buddyp450 2013-03-18 12:15:08

1

該問題存在於加載的SWF中,它只是不清理音頻本身。 嘗試卸載事件附加到影片剪輯這樣的:

MovieClip(event.target.content).loaderInfo.addEventListener(Event.UNLOAD, unloadMovieClipHandler); 
private function unloadMovieClipHandler(event:Event) : void 
{ 
    SoundMixer.stopAll();       
} 
0

嘗試以下操作:

try { 
    new LocalConnection().connect('foo'); 
    new LocalConnection().connect('foo'); 
} catch (e:*) {} 

這將迫使垃圾收集程序。如果你的SWF仍然連接,那麼你錯過了某種連接,如音頻。

有幾個方法可以強制GC,所有種類的吸吮,因爲他們穗的CPU,但好消息是,官方的方法是在Flash Player 10來:

unloadAndStop 

鏈接:http://www.gskinner.com/blog/archives/2008/07/unloadandstop_i.html

在那之前,恐怕你必須像上面顯示的那樣使用黑客來強制它。

+0

GC hack對我來說似乎不是最佳實踐。我只建議在開發環境中使用它,以幫助獲得更有意義的內存使用價值。在生產中依靠它可能會讓你後悔。 – aaaidan 2008-10-22 03:55:59

0

您沒有顯示所有代碼,因此我假定您沒有使用Loader類的卸載方法。另外swfLoader.load(null)對我來說似乎是錯誤的,因爲加載方法需要URLRequest對象。當你想在最後清理東西時,將對象的值設置爲null,而不是調用空載。事實上,您仍然聽到的音頻表明您的數據未卸載,或者音頻文件未駐留在卸載的內容中。讓我們一起來看看這個。

以下示例


var loader:Loader = new Loader(); 
var request:URLRequest = new URLRequest('test.swf'); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfLoad, false, 0, true);

function onSwfLoad(e:Event):void { addChild(loader); loader.contentLoaderInfo.addEventListener(Event.UNLOAD, onLoaderUnload, false, 0, true);

loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onSwfLoad, false); } function onLoaderUnload(e:Event):void { trace('LOADER WAS SUCCESSFULLY UNLOADED.'); } //Now to remove this with the click of a button, assuming the buttons name is button_mc button_mc.addEventListener(MouseEvent.MOUSE_DOWN, onButtonDown, false, 0, true);

function onButtonDown(e:MouseEvent):void { loader.unload(); loader.contentLoaderInfo.removeEventListener(Event.UNLOAD, onLoaderUnload); //When you want to remove things completely from memory you simply set their value to null. loader = null; button_mc.removeEventListener(MouseEvent.MOUSE_DOWN, onButtonDown); }

我確實希望這有幫助,如果它是多餘的,我很抱歉,但沒有看到您的代碼,我無法確切知道您是如何處理這個問題的。

+0

我沒有使用Loader,我使用Flex SWFLoader組件。不過,明天早上我會試一試Loader類。謝謝... – Shawn 2008-09-23 04:19:08

2

這是一個嚴重創建的SWF可能沉溺您的應用程序的問題,並且許多與此相關的問題將在Flash Player 10中得到修復,正如其他人所提及的。但是,無論平臺如何,如果加載第三方代碼,您總會遇到問題,但總有可能存在錯誤,內存泄漏或徹頭徹尾的惡意代碼。除非你可以將內容加載到沙盒中(並且你不能在Flash中,至少目前還不行),否則加載不好的東西會使應用程序崩潰,就像這樣簡單。

我很抱歉地說,除非你能保證加載內容的質量,否則你不能保證你自己的應用程序的質量。 Flash開發人員因編寫泄漏或無法卸載的東西而臭名昭着,因爲Flash可以輕鬆做出錯誤的事情,特別是對於時間線上的事情。加載任何你無法直接控制的Flash內容是非常危險的。

1

我通常會遠離SWFLoader並使用mx.modules包中的類。

Flex有一個模塊系統來啓用這種類型的行爲。你可以在這裏查看:http://livedocs.adobe.com/flex/3/html/help.html?content=modular_3.html。一般來說,動態加載和卸載swf組件是非常棘手的,尤其是如果這些模塊修改應用程序中的任何全局狀態(樣式等)。但是,如果你爲你的模塊創建一個接口,然後每個你加載/卸載的類實現該接口並擴展Flex模塊類,你可以乾淨地加載和卸載它們。

2

最好的解決辦法是

swfLoader.autoLoad = false; 
swfLoader.unloadAndStop(); 
swfLoader.autoLoad = true; 

這樣你停止播放器,從內存中卸載的內容,避免聲音仍然打.. 乾杯

相關問題