Как выгрузить загруженный извне SWF-файл из компонента SWFLoader в Adobe Flex?

У меня есть приложение, которое загружает внешние SWF-файлы и воспроизводит их в приложении Adobe Flex / Air через Компонент SWFLoader Flex. Я пытался найти способ выгрузить их из события нажатия кнопки. У меня есть гугл повсюду, и, кажется, никто не смог бы сделать это без взлома. Я вижу, что люди используют следующую комбинацию кода:

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: я не могу редактировать настоящие SWF-фильмы, они созданы клиентом. Если я не могу закрыть какой-либо SWF, открытый через Flex, разве это не проблема архитектуры Flex? Единственный ли вариант - отправить SWF-файлы в веб-браузер?


person Shawn    schedule 22.09.2008    source источник
comment
Изменить: похоже на ошибку с flash 9. Надеюсь, теперь исправлено: D   -  person Shawn    schedule 01.11.2008


Ответы (7)


... разве это не проблема архитектуры Flex?

Да, это так, и это также влияет на Flash в целом. Пока вы не сможете воспользоваться преимуществами Loader.unloadAndStop () в FP10 (AIR 1.5), вы не можете гарантировать, что внешне загруженное содержимое не будет продолжать потреблять память и ресурсы процессора, даже если вы используете метод Loader.unload(). (Честно говоря, я не уверен на 100%, что даже это гарантирует освобождение ресурсов, но, возможно, я пессимист.)

Следующее, что лучше всего, - это настоять на том, чтобы создатели загружаемого вами контента придерживались ряда рекомендаций, включая использование чего-то вроде dispose() метода, который ваше приложение может вызывать, чтобы попросить его освободить как можно больше ресурсов, прежде чем вы unload() это . Если это невозможно, то ваше приложение почти наверняка будет увеличивать объем памяти и использование процессора каждый раз, когда вы загружаете внешний swf. Прости.

Если от этого вам станет легче, значит, вы не одиноки. ;)

person aaaidan    schedule 22.10.2008
comment
На самом деле нашел этот пост после того, как Loader.unloadAndStop () не сработал. Надежды нет! - person buddyp450; 18.03.2013
comment
Странный. Вы можете уточнить? Может быть, даже задать вопрос, если его еще нет! - person aaaidan; 20.03.2013

Проблема заключается в том, что плохо созданный SWF может затопить ваше приложение, и многие из проблем с этим будут исправлены в Flash Player 10, как уже упоминалось другими. Однако, независимо от платформы, вы всегда рискуете столкнуться с проблемами, если загрузите сторонний код, всегда есть вероятность, что он содержит ошибки, утечки памяти или совершенно вредоносный код. Если вы не можете загружать контент в песочницу (а во Flash вы не можете, по крайней мере, пока), загрузка плохих вещей приведет к потере вашего приложения, это так просто.

С сожалением вынужден сказать, что, если вы не можете гарантировать качество загруженного контента, вы не можете гарантировать качество своего собственного приложения. Разработчики Flash известны тем, что они пишут вещи, которые протекают или не могут быть выгружены, потому что Flash позволяет легко сделать неправильные вещи, особенно для вещей, которые живут на временной шкале. Загрузка любого Flash-содержимого, которое вы не контролируете напрямую, очень опасна.

person Theo    schedule 23.09.2008

Лучшее решение -

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

Таким образом вы останавливаете проигрыватель, выгружаете контент из памяти и избегаете звука, чтобы он продолжал играть .. Ура

person Yury Euceda    schedule 26.02.2013

Проблема заключается в загруженном swf, он просто не очищает звук после себя. Попробуйте прикрепить событие выгрузки к фрагменту ролика следующим образом:

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

Я бы обычно держался подальше от SWFLoader и использовал классы из пакета mx.modules.

Flex имеет модульную систему, которая обеспечивает такой тип поведения. Вы можете проверить это здесь: http://livedocs.adobe.com/flex/3/html/help.html?content=modular_3.html. В общем, динамическая загрузка и выгрузка компонентов swf является сложной задачей, особенно если эти модули изменяют какое-либо глобальное состояние в приложении (стили и т. Д.). Но если вы создаете интерфейс для своих модулей, а затем каждый загружаемый / выгружаемый класс реализует этот интерфейс, а также расширяет класс гибкого модуля, вы можете загружать и выгружать их чисто.

person Community    schedule 15.01.2009

Попробуйте следующее:

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

Это вызовет процедуру сборки мусора. Если ваш SWF-файл все еще прикреплен, значит, вы пропустили какое-то соединение, например, аудио.

Есть несколько способов принудительно использовать сборщик мусора, которые все отстойны, потому что они увеличивают нагрузку на ЦП, но хорошая новость заключается в том, что в Flash Player 10 появится официальный способ:

unloadAndStop

ссылка: http://www.gskinner.com/blog/archives/2008/07/unloadandstop_i.html

А до тех пор, я боюсь, вам придется заставить его взломать, как я показал выше.

person Brent    schedule 23.09.2008
comment
Этот взлом GC мне не кажется лучшей практикой. Я бы рекомендовал использовать его только в среде разработки, чтобы получить более значимое значение использования памяти. Вы можете потом сожалеть о том, что полагаться на него в производственной среде. - person aaaidan; 22.10.2008

Вы не показали весь свой код, поэтому я предполагаю, что вы не использовали метод выгрузки класса Loader. Также swfLoader.load (null) кажется мне неправильным, поскольку метод загрузки ожидает объект URLRequest. Если вы хотите очистить вещи в конце, установите значение объекта равным нулю вместо вызова нулевой загрузки. Тот факт, что вы все еще слышите звук, указывает на то, что ваши данные не были выгружены или аудиофайл не находится внутри выгруженного содержимого. Давайте пройдемся через это.

Пример ниже


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

Я действительно надеюсь, что это было полезно, и мне очень жаль, если это было лишним, но, не видя вашего кода, я не могу точно узнать, как вы подошли к этому.

person Brian Hodge    schedule 23.09.2008
comment
Я не использую загрузчик, я использую компонент Flex SWFLoader. Но завтра утром я попробую класс Loader. Спасибо... - person Shawn; 23.09.2008