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;

それから私は:

swfLoader.load(file1);

後で:

swfLoader.unloadAndStop(true);

ビデオをアンロードしますが、サウンドはアンロードしません! だから私は追加します

SoundMixer.stopAll();

大丈夫です、しばらくの間。後で、私はします:

swfLoader.load(file2);

そして最終的に、ファイル 2 を見ている間、ファイル 1 のオーディオがファイル 2 のオーディオの上にバックグラウンドで再生され始めます。それを止める方法はありません! file1 のオーディオを停止する適切な方法は何ですか? 私が見続ける方法は、私が使用している unloadAndStop() を使用することです。毎回新しい swfLoader オブジェクトを作成する必要がない限り?

以下の Konrad の回答によると、REMOVED_FROM_STAGE などのクリーンアップ イベントでサウンドの再生を停止する必要がありますが、SWFLoader でロードされた swf ファイルでサウンドの再生を停止するにはどうすればよいですか? それを行う明確な方法がわかりません。

4

2 に答える 2

2

問題はロードされたコンテンツにあるため、解決策は少しトリッキーです。

ガベージ コレクターはサウンドをまだ再生しているため (Flash Player によって参照されているため)、サウンドを削除しませんが、そのサウンド チャネルにアクセスすることはできません (クラスの非公開変数に似ているため)。その行動は完全に正しいです。

解決策: ロードされた swf コードでは、そのサウンドの再生を停止する必要があります (REMOVED_FROM_STAGE またはその他の「クリーンアップ」イベント ハンドラで)。他のソリューション (SoundMixer.stopAll など) は、場合によっては機能しますが、すべてではありません。

私たちは、アプリケーションの後にきれいにすることを忘れがちです。Flash Player のインスタンスと同じように存在する場合は問題ありません (削除すると、swf で使用されているすべてのメモリが消去されます)。問題は、swfs をロードおよびアンロードするときに始まります。クリーンアップを無視すると、メモリ リークが発生しやすくなります。

于 2013-04-21T02:12:14.743 に答える
0

swfLoader.unloadAndStop(真);

swf とサウンドも削除します。私にとってはうまくいきます。ドキュメントにも次のように書かれています:画像またはSWFファイルをアンロードします。このメソッドが返された後、ソース プロパティは null になります。これは、ホストの Flash Player がバージョン 10 以降の場合にのみサポートされます。ホスト Flash Player がバージョン 10 未満の場合、このメソッドは source が null に設定されている場合と同じ方法でコンテンツをアンロードします。このメソッドは、子 SWF ファイルの EventDispatcher、NetConnection、Timer、Sound、または Video オブジェクトへの参照を削除して、SWF ファイルのアンロードを試みます。その結果、子 SWF ファイルと子 SWF ファイルの表示リストで次のことが発生します 。 サウンドが停止します。 ステージ イベント リスナーは削除されます。enterFrame、frameConstructed、exitFrame、activate、deactivate のイベント リスナーが削除されました。タイマーは停止しています。カメラとマイクのインスタンスが切り離されている ムービー クリップが停止している。

于 2013-05-04T09:08:54.913 に答える