Como faço para descarregar um arquivo SWF carregado externamente de um componente SWFLoader em Adobe Flex?

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

Pergunta

Eu tenho um aplicativo que carrega arquivos SWF externos e joga-los dentro de um aplicativo Adobe Flex / Air através do rel SWFLoader Flex componente . I foram tentando encontrar uma maneira de descarregá-los a partir de um evento de clique de botão. Eu tenho Google'd longe e ninguém parece ter sido capaz de fazê-lo sem um hack. A combinação de código que eu ver o uso de pessoas é:

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.

Se os fundos soberanos estão fechados (escondido) dessa forma, eventualmente, as falhas do programa.

Todas as idéias? Eu encontrei toneladas de mensagens em diversos fóruns com pessoas com o mesmo problema. Assumo obter um resposta errada / incompleta aqui, e que o meu post vai afundar no nada, como de costume, mas de qualquer forma, obrigado antecipadamente!

Editar 1 : Eu não pode editar os filmes SWF reais, eles são criados pelo cliente. Se eu não posso fechar Qualquer SWF aberto através Flex, que não é um problema com a arquitetura Flex? É a minha única opção de enviar os SWFs para o navegador da web?

Foi útil?

Solução

... não é que um problema com a arquitetura Flex?

Sim, é, e também afeta o Flash em geral. Até que você possa aproveitar a Loader.unloadAndStop () método em FP10 (AIR 1.5), você não pode garantir que o conteúdo carregado externamente não vai continuar a consumir recursos de memória e CPU, mesmo se você usar o método Loader.unload(). (Para ser honesto, eu não estou 100% de certeza que mesmo que garantirá libertação de recursos, mas talvez eu sou um pessimista.)

A próxima melhor coisa é você insistir que os criadores do conteúdo que você carregar aderir a um conjunto de orientações, incluindo expor algo como um método dispose() que seu aplicativo pode chamar para pedir-lhe para liberar tantos recursos quanto possível antes você unload()-lo. Se isso não for possível, então a sua aplicação irá quase certamente inchar no uso de memória e CPU cada vez que você carregar um swf externo. Desculpe.

Se isso faz você se sentir melhor, você não está sozinho. ;)

Outras dicas

É um problema que um SWF mal criado pode afundar a sua aplicação, e muitos dos problemas com isso será corrigido no Flash Player 10, como outros já mencionaram. No entanto, independentemente da plataforma que você será sempre o risco de ter problemas se você carregar código de terceiros, há sempre a possibilidade de que ele contém erros, falhas de memória ou código francamente maliciosa. A menos que você pode carregar o conteúdo em uma caixa de areia (e você não pode, em Flash, pelo menos não ainda), carregando coisas ruins vão afundar a sua aplicação, é tão simples como isso.

Lamento dizer que a menos que você pode garantir a qualidade do conteúdo carregado você não pode garantir a qualidade de sua própria aplicação. Os desenvolvedores de Flash são notórias para escrever coisas que vazamento, ou não pode ser descarregado, porque o Flash faz com que seja fácil de fazer a coisa errada, especialmente para as coisas que vivem na linha de tempo. Carregando qualquer conteúdo Flash que você não tem controle sobre diretamente é muito perigosa.

A melhor solução é

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

Desta forma você parar o jogador, descarregar o conteúdo da memória e evitar o som de permanecer jogando .. Felicidades

Os reside problema no SWF carregado, ele simplesmente não limpar o áudio depois de si mesmo. Tente ligar um evento de descarregamento para movieclips assim:

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

Eu geralmente ficar longe de SWFLoader e usar as classes no pacote mx.modules.

Flex tem um sistema módulo que permite esse tipo de comportamento. Você pode verificá-la aqui: http: // livedocs conteúdo .adobe.com / flex / 3 / html / help.html? = modular_3.html . Em geral, dinamicamente carregamento e descarregamento componentes swf é complicado, especialmente se esses módulos modificar qualquer estado global na aplicação (estilos, etc ..). Mas se você criar uma interface para seus módulos, e em seguida, cada classe que você carregar / descarregar implementar essa interface, bem como estender a classe módulo Flex, você pode carregar e descarregar-los de forma limpa.

Tente o seguinte:

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

Isso vai forçar uma rotina de coleta de lixo. Se o seu SWF ainda está ligado, em seguida, você perdeu algum tipo de conexão, como o áudio.

Existem algumas formas de forçar GC, que todo o tipo de chupar porque pico CPU, mas a boa notícia é que uma forma oficial está chegando no Flash Player 10:

unloadAndStop

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

Até então, eu tenho medo que você vai ter que forçá-la com hacks como eu mostrei acima.

Você não mostrou todo o seu código assim que eu estou indo supor que você não usar o método de descarregamento da classe Loader. Também swfLoader.load (null) parece errado para mim como o método de carga está esperando um objeto URLRequest. Quando você quer as coisas limpas no final, definir o valor do objeto como nulo em vez de chamar uma carga nula. O fato de que o seu ainda audio ouvir indica que seus dados não foi descarregado, ou o arquivo de áudio não reside dentro do conteúdo que foi descarregado. Deixa a caminhada através deste.

Exemplo abaixo


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

Espero que isso foi útil, e lamento se foi redundante, mas sem ver seu código eu não tenho nenhuma maneira de saber exatamente como você abordou este.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top