Comment décharger un fichier SWF chargé en externe depuis un composant SWFLoader dans Adobe Flex?

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

Question

J'ai une application qui charge des fichiers SWF externes et les lit dans une application Adobe Flex / Air via le Composant SWFLoader Flex . J'ai essayé de trouver un moyen de les décharger d'un événement de clic sur un bouton. J'ai Google'd loin et personne ne semble avoir été capable de le faire sans un bidouillage. La combinaison de code que je vois utiliser est la suivante:

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.

Si les fichiers SWF sont fermés (masqués) de cette façon, le programme se bloque finalement.

Des idées? J'ai trouvé des tonnes de messages dans divers forums avec des personnes ayant le même problème. Je suppose que je vais obtenir une réponse fausse / incomplète ici, et que mon message va sombrer dans le néant, comme d'habitude, mais dans tous les cas, merci d'avance!

Éditer 1 : Je ne peux pas éditer les films SWF réels, ils sont créés par le client. Si je ne parviens pas à fermer un fichier SWF ouvert via Flex, n’est-ce pas un problème avec l’architecture Flex? Ma seule option est-elle d’envoyer les fichiers SWF au navigateur Web?

Était-ce utile?

La solution

  

... n'est-ce pas un problème avec l'architecture Flex?

Oui, c’est vrai, et cela affecte également Flash en général. En attendant de pouvoir tirer parti de Loader.unloadAndStop () dans FP10 (AIR 1.5), vous ne pouvez pas garantir que le contenu chargé en externe ne continuera pas à consommer de la mémoire et des ressources processeur, même si vous utilisez la méthode Loader.unload () . (Pour être honnête, je ne suis pas sûr à 100% que même cela garantira la libération de ressources, mais je suis peut-être pessimiste.)

La meilleure chose à faire est d'insister pour que les créateurs du contenu que vous chargez adhèrent à un ensemble de règles, notamment en exposant une méthode semblable à une méthode dispose () que votre application peut appeler pour demander libérer autant de ressources que possible avant de unload () . Si cela n’est pas possible, votre application va probablement saturer la mémoire et l’utilisation du processeur chaque fois que vous chargez un fichier swf externe. Pardon.

Si cela vous fait vous sentir mieux, vous n'êtes pas seul. ;)

Autres conseils

Le problème est qu'un fichier SWF mal créé peut couler votre application. De nombreux problèmes liés à ce problème seront résolus dans Flash Player 10, comme d'autres l'ont mentionné. Cependant, quelle que soit la plate-forme, vous risquez toujours de rencontrer des problèmes si vous chargez du code tiers, il est toujours possible qu’il contienne des bogues, des fuites de mémoire ou un code malveillant. À moins que vous ne puissiez charger du contenu dans un bac à sable (et que vous ne puissiez pas le faire en Flash, du moins pas encore), le chargement d'objets défectueux coulera votre application, c'est aussi simple que cela.

Je suis désolé de dire que si vous ne pouvez pas garantir la qualité du contenu chargé, vous ne pouvez pas garantir la qualité de votre propre application. Les développeurs Flash sont connus pour écrire des choses qui fuient ou qui ne peuvent pas être déchargées, car il est facile de faire la mauvaise chose, en particulier pour les choses qui vivent dans le temps. Le chargement de contenu Flash sur lequel vous n'avez pas le contrôle direct est très périlleux.

La meilleure solution est

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

De cette façon, vous arrêtez le lecteur, déchargez le contenu de la mémoire et évitez que le son ne reste en lecture. A la vôtre

Le problème réside dans le fichier swf chargé. Il ne nettoie tout simplement pas l’audio après lui-même. Essayez d’attacher un événement de déchargement à un clip comme ceci:

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

Je resterais généralement à l’écart de SWFLoader et utiliserais les classes du package mx.modules.

Flex dispose d’un système de modules permettant ce type de comportement. Vous pouvez y jeter un coup d'œil ici: http: // aliveocs .adobe.com / flex / 3 / html / help.html? content = modular_3.html . En général, charger et décharger dynamiquement des composants swf est délicat, surtout si ces modules modifient un état global de l'application (styles, etc.). Mais si vous créez une interface pour vos modules, puis que chaque classe que vous chargez / déchargez met en œuvre cette interface et étend la classe de module flex, vous pouvez les charger et les décharger proprement.

Essayez ce qui suit:

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

Cela forcera une routine de récupération de place. Si votre fichier SWF est toujours attaché, vous avez manqué une sorte de connexion, telle que l'audio.

Il y a plusieurs façons de forcer le GC, ce qui est très nul en raison de la pointe du processeur, mais la bonne nouvelle est qu'un chemin officiel se prépare dans Flash Player 10:

unloadAndStop

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

Jusque-là, j'ai bien peur que vous deviez le forcer avec des hacks, comme je l'ai montré ci-dessus.

Vous n'avez pas montré tout votre code, je vais donc supposer que vous n'avez pas utilisé la méthode de déchargement de la classe Loader. De plus, swfLoader.load (null) ne me semble pas correct, car la méthode de chargement attend un objet URLRequest. Lorsque vous souhaitez nettoyer les éléments à la fin, définissez la valeur de l'objet sur null au lieu d'appeler un chargement nul. Le fait que l'audio que vous entendez toujours indique que vos données n'ont pas été déchargées ou que le fichier audio ne réside pas dans le contenu déchargé. Permet de traverser cela.

Exemple ci-dessous


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

J'espère que cela a été utile, et je suis désolé si c'était redondant, mais sans voir votre code, je n'ai aucun moyen de savoir exactement comment vous l'avez abordé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top