2013-04-20 112 views
1
public var swfLoader:SWFLoader = new SWFLoader(); 

[Embed(source="/some/file1.swf")] 
public var file1:Class; 

[Embed(source="/some/file2.swf")] 
public var file2:Class; 

然後我做的:如何讓Flex SWFLoader unloadAndStop卸載聲音?

swfLoader.load(file1); 

後來:

swfLoader.unloadAndStop(true); 

其卸載視頻,但沒了聲音!所以我加入

SoundMixer.stopAll(); 

這是好的,一段時間。後來,我做的:

swfLoader.load(file2); 

最終,一邊看文件2,文件1的音頻將開始在後臺播放過文件2的音頻,沒有辦法阻止它!什麼是停止file1音頻的正確方法?我一直看到的方式是使用我正在使用的unloadAndStop()。除非我每次都必須創建一個新的swfLoader對象?

根據Konrad的回答,我應該停止播放清理事件中的聲音,例如REMOVED_FROM_STAGE,但是,如何停止播放使用SWFLoader加載的swf文件的聲音?我沒有看到明顯的做法。

回答

2

解決方法有點棘手,因爲問題是加載的內容。

由於垃圾收集器仍在播放(因此它被Flash Player引用),但您無法訪問其聲音通道(因爲其隱藏類似於類中的私有變量),所以垃圾收集器不會刪除聲音。這種行爲是完全正確的。

解決方案:在加載的swf代碼中,您應該停止播放該聲音(在REMOVED_FROM_STAGE或其他「清理」事件處理程序中)。其他解決方案(如SoundMixer.stopAll)可以在某些情況下工作,但不會。

我們經常忘記在我們的應用程序後清理。它沒有問題,如果他們存在與Flash Player的實例相同(刪除它將清除我們的swf使用的所有內存)。當我們加載和卸載swfs時,問題就開始了。忽視清理是內存泄漏的快速途徑。

+0

謝謝您的回覆。我最終從這個答覆中發現了它。我所做的是將REMOVED_FROM_STAGE事件處理程序添加到內部(加載的)swf中的DisplayObject(root),並刪除其中的所有事件處理程序,然後調用stop();. – StackQ 2013-04-30 17:35:09

0

swfLoader.unloadAndStop(true);

是否也刪除swf和聲音。 適合我。 即使文檔中提到: 卸載圖像或SWF文件。此方法返回後,源屬性將爲空。這僅在主機Flash Player版本爲10或更高時才受支持。如果主機Flash Player的版本低於版本10,則此方法將以與source設置爲null相同的方式卸載內容。此方法嘗試通過刪除對子SWF文件的EventDispatcher,NetConnection,Timer,Sound或Video對象的引用來卸載SWF文件。因此,子SWF文件和子SWF文件的顯示列表會發生以下情況: 聲音已停止。 舞臺事件偵聽器被刪除。 刪除enterFrame,frameConstructed,exitFrame,激活和停用的事件偵聽器。 定時器停止。 相機和麥克風實例分離 影片剪輯已停止。