Wie entladen ich eine extern geladene SWF-Datei aus einer SWFLoader Komponente in Adobe Flex?

StackOverflow https://stackoverflow.com/questions/117900

Frage

Ich habe eine Anwendung, die externen SWF-Dateien lädt und spielt sie in einer Adobe Flex / AIR-Anwendung über das SWFLoader Flex-Komponente . Ich habe versucht, einen Weg zu finden, um sie von einem Button-Klick-Ereignisse zu entladen. Ich habe weit und breit, und niemand scheint Google'd der Lage gewesen zu sein, es ohne einen Hack zu tun. Die Kombination von Code, den ich sehe, wie Menschen benutzen ist:

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.

Wenn die SWFs geschlossen sind (versteckt) auf diese Weise schließlich das Programm stürzt ab.

Irgendwelche Ideen? Ich habe Tonnen Beiträge in verschiedenen Foren gefunden, mit Menschen mit dem gleichen Problem. Ich nehme an, ich werde hier eine falsche / unvollständige Antwort bekommen, und als mein Beitrag werde sinken ins Nichts wie gewohnt, aber so oder so, Dank im Voraus!

Bearbeiten 1 : ich die eigentlichen SWF-Filme nicht bearbeiten kann, werden sie von dem Client erstellt. Wenn ich keine SWF geöffnet durch Flex schließen kann, ist das nicht ein Problem mit der Flex-Architektur? Ist meine einzige Option, um die SWF-Dateien zum Web-Browser zu senden?

War es hilfreich?

Lösung

  

... ist das nicht ein Problem mit der Flex-Architektur?

Ja, es ist, und es wirkt sich auch auf Flash-im Allgemeinen. Bis Sie die Vorteile der Loader.unloadAndStop () nehmen Verfahren in FP10 (AIR 1.5), können Sie, dass extern geladene Inhalt Speicher- und CPU-Ressourcen nicht selbst nicht garantieren, auch weiterhin konsumieren, wenn Sie die Loader.unload() Methode verwenden. (Um ehrlich zu sein, ich bin nicht 100% sicher, dass auch das garantiert von Ressourcen frei, aber vielleicht bin ich ein Pessimist.)

Die nächste beste Sache ist für Sie die Schöpfer der Inhalte darauf bestehen, dass Sie auf eine Reihe von Richtlinien einhalten zu laden, darunter so etwas wie ein dispose() Verfahren auszusetzen, die Ihre Anwendung aufrufen kann es zu fragen, so viele Ressourcen wie möglich zu lösen, bevor Sie unload() es. Wenn dies nicht möglich ist, dann wird Ihre Anwendung fast aufblasen auf jeden Fall im Speicher und CPU-Auslastung jedes Mal, wenn Sie eine externe swf laden. Es tut uns leid.

Wenn es Ihnen besser fühlen lässt, sind Sie nicht allein. ;)

Andere Tipps

Es ist ein Problem, dass ein schlecht erstellten SWF Ihre Anwendung sinken kann, und viele der Probleme mit dieser wird in Flash Player 10 festgelegt werden, wie andere erwähnt haben. Doch unabhängig von der Plattform werden Sie immer Probleme riskieren, wenn Sie Dritten Code laden, gibt es immer die Möglichkeit, dass es Fehler enthält, Speicherlecks oder geradezu bösartigen Code. Sofern Sie Inhalte in einer Sandbox laden kann (und Sie können nicht in Flash, zumindest noch nicht), Laden schlechte Dinge wird Ihre App sinken, es ist so einfach wie das.

Es tut mir leid zu sagen, dass, wenn Sie die Qualität des geladenen Inhalts garantieren können Sie die Qualität Ihrer eigenen Anwendung garantieren. Flash-Entwickler sind berüchtigt für Dinge zu schreiben, die auslaufen, oder können nicht entladen werden, da Flash macht es einfach, die falsche Sache, vor allem für Dinge zu tun, die auf der Zeitlinie leben. Laden Sie alle Flash-Inhalte, die Sie nicht direkt Kontrolle über sehr gefährlich ist.

Die beste Lösung ist

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

Auf diese Weise können Sie den Player stoppen, entladen den Inhalt aus dem Speicher und vermeidet den Ton spielen zu bleiben .. Prost

Das Problem liegt in der geladenen swf, es ist einfach nicht das Audio nach selbst nicht aufzuräumen. Versuchen Anbringen eines Entlade-Ereignis auf Videoclips wie folgt aus:

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

Ich würde im Allgemeinen bleibe von SWFLoader entfernt und die Klassen im mx.modules Paket verwenden.

Flex hat ein Modulsystem, das diese Art von Verhalten ermöglicht. Sie können es hier: http: // LiveDocs .adobe.com / flex / 3 / html / help.html? content = modular_3.html . In der Regel dynamisch geladen und Komponenten swf Entladen ist schwierig, vor allem, wenn diese Module alle globalen Zustand in der Anwendung ändern (Stile, etc ..). Aber wenn Sie eine Schnittstelle für Ihre Module erstellen, und dann jede Klasse, die Sie Laden / Entladen dieser Schnittstelle implementieren sowie die Flex-Modul-Klasse erweitern, können Sie sie sauber laden und entladen.

Versuchen Sie Folgendes:

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

Das wird eine Garbage Collection Routine erzwingen. Wenn die SWF noch angebracht ist, dann haben Sie eine Art von Anschluss verpasst, wie die Audio.

Es gibt ein paar Möglichkeiten, GC zu zwingen, die alle Art von saugen, weil sie CPU Spike, aber die gute Nachricht ist, dass ein offizieller Weg in Flash Player kommt 10:

unloadAndStop

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

Bis dahin, ich fürchte, Sie werden es mit Hacks zwingen müssen, wie ich oben zeigte.

Sie haben nicht alle Ihre Code gezeigt, damit ich Ihnen die Entlastungsverfahren der Loader-Klasse verwenden, nicht zu übernehmen werde. Auch swfLoader.load (null) scheint falsch zu mir wie die Load-Methode wird ein URLRequest-Objekt erwartet. Wenn Sie wollen die Dinge reinigen am Ende nach oben, legen Sie den Wert des Objekts auf null anstatt eine Null-Last zu nennen. Die Tatsache, dass Ihr noch Ton hören gibt an, dass Ihre Daten nicht entladen wurden, oder die Audio-Datei in dem Inhalt nicht befindet, die entladen wurde. Lässt durch diese gehen.

Beispiel unter


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); }

Ich hoffe, dass dies hilfreich, und es tut mir leid, wenn es überflüssig war, aber ohne den Code zu sehen, ich habe keine Möglichkeit, genau zu wissen, wie Sie diese genähert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top