3

外部のSWFファイルをロードし、 SWFLoaderFlexコンポーネントを介してAdobeFlex/Airアプリケーション内でそれらを再生するアプリケーションがあります。私はボタンクリックイベントからそれらをアンロードする方法を見つけようとしてきました。私はグーグルを広範囲に使ってきましたが、ハックなしでは誰もそれを行うことができなかったようです。人々が使用していると思われるコードの組み合わせは次のとおりです。

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.

この方法でSWFを閉じる(非表示にする)と、最終的にプログラムがクラッシュします。

何か案は?同じ問題を抱えている人々とのさまざまなフォーラムでたくさんの投稿を見つけました。私はここで1つの間違った/不完全な答えを得ると思います、そして私の投稿はいつものように無に沈むでしょう、しかしどちらにしても、事前に感謝します!

編集1:実際のSWFムービーを編集できません。クライアントによって作成されています。Flexを介して開いたSWFを閉じることができない場合、それはFlexアーキテクチャの問題ではありませんか?SWFをWebブラウザに送信する唯一のオプションはありますか?

4

7 に答える 7

6

...それは Flex アーキテクチャの問題ではありませんか?

はい、そうです。Flash 全般にも影響します。FP10 (AIR 1.5) でLoader.unloadAndStop()メソッドを利用できるようになるまでは、このメソッドを使用したとしても、外部から読み込まれたコンテンツが引き続きメモリと CPU リソースを消費しないことを保証することはできませんLoader.unload()。(正直なところ、それでもリソースの解放が保証されるかどうかは 100% 確信が持てませんが、私は悲観主義者かもしれません。)

次善の策は、ロードするコンテンツの作成者が一連のガイドラインを遵守することを主張することです。dispose()これには、アプリケーションが呼び出して、できるだけ多くのリソースを解放する前に要求できるメソッドのようなものを公開することも含まれますunload()。これが不可能な場合、外部 SWF をロードするたびに、アプリケーションのメモリと CPU 使用量がほぼ確実に肥大化します。ごめん。

少しでも気分が良くなったとしたら、それはあなただけではありません。;)

于 2008-10-22T04:00:36.930 に答える
2

正しく作成されていないSWFがアプリケーションをシンクする可能性があるのは問題であり、他の人が述べているように、これに関する問題の多くはFlashPlayer10で修正されます。ただし、プラットフォームに関係なく、サードパーティのコードをロードすると常に問題が発生するリスクがあります。バグ、メモリリーク、またはまったく悪意のあるコードが含まれている可能性が常にあります。コンテンツをサンドボックスにロードできない限り(そして、少なくともまだFlashにはロードできない)、悪いものをロードするとアプリが沈んでしまいます。それはそれと同じくらい簡単です。

申し訳ありませんが、読み込まれたコンテンツの品質を保証できない限り、独自のアプリケーションの品質を保証することはできません。Flashの開発者は、リークしたり、アンロードできないものを作成することで有名です。Flashを使用すると、特にタイムライン上に存在するものに対して、間違ったことを簡単に実行できるためです。直接制御できないFlashコンテンツをロードすることは非常に危険です。

于 2008-09-23T07:02:36.333 に答える
2

最善の解決策は

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

このようにして、プレーヤーを停止し、コンテンツをメモリからアンロードして、サウンドが再生され続けるのを防ぎます。乾杯

于 2013-02-26T18:30:48.930 に答える
1

問題は、ロードされた swf にあります。単にオーディオをクリーンアップしないだけです。次のように、アンロード イベントをムービークリップに追加してみてください。

MovieClip(event.target.content).loaderInfo.addEventListener(Event.UNLOAD, unloadMovieClipHandler);
private function unloadMovieClipHandler(event:Event) : void
{
  SoundMixer.stopAll();                           
} 
于 2008-09-22T22:32:30.817 に答える
1

私は通常、SWFLoader には近づかず、mx.modules パッケージのクラスを使用します。

Flex には、このタイプの動作を可能にするモジュール システムがあります。http://livedocs.adobe.com/flex/3/html/help.html?content=modular_3.htmlで確認できます。一般に、swf コンポーネントを動的にロードおよびアンロードするのは注意が必要です。特に、これらのモジュールがアプリケーションのグローバル状態 (スタイルなど) を変更する場合はなおさらです。しかし、モジュールのインターフェイスを作成し、ロード/アンロードする各クラスがそのインターフェイスを実装し、フレックス モジュール クラスを拡張する場合、それらをきれいにロードおよびアンロードできます。

于 2009-01-15T23:39:53.447 に答える
0

次のことを試してください。

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

これにより、ガベージコレクションルーチンが強制されます。SWFがまだ接続されている場合は、オーディオなどの接続が失われています。

GCを強制する方法はいくつかありますが、CPUを急上昇させるため、あらゆる種類の問題が発生しますが、FlashPlayer10では公式の方法が登場します。

unloadAndStop

リンク:http ://www.gskinner.com/blog/archives/2008/07/unloadandstop_i.html

それまでは、上で示したようなハックで強制する必要があるのではないかと思います。

于 2008-09-23T00:43:29.100 に答える
0

すべてのコードを示していないので、Loader クラスの unload メソッドを使用していないと仮定します。また、 load メソッドが URLRequest オブジェクトを予期しているため、 swfLoader.load(null) は間違っているようです。最後にクリーンアップしたい場合は、null ロードを呼び出す代わりに、オブジェクトの値を 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); }

これがお役に立てば幸いです。重複していた場合は申し訳ありませんが、コードを見ないと、これにどのようにアプローチしたかを正確に知る方法がありません.

于 2008-09-23T01:32:28.000 に答える