Adobe Flex의 SWFLoader 구성 요소에서 외부에서 로드된 SWF 파일을 어떻게 언로드합니까?

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

문제

외부 SWF 파일을 로드하고 이를 통해 Adobe Flex/Air 응용 프로그램 내에서 재생하는 응용 프로그램이 있습니다. SWFLoader Flex 구성 요소.나는 버튼 클릭 이벤트에서 그것들을 언로드하는 방법을 찾으려고 노력해 왔습니다.나는 Google을 광범위하게 사용했지만 해킹 없이는 누구도 그것을 할 수 없었던 것 같습니다.사람들이 사용하는 코드 조합은 다음과 같습니다.

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 동영상은 편집할 수 없습니다. 해당 동영상은 클라이언트에서 만든 것입니다.Flex를 통해 열린 SWF를 닫을 수 없다면 Flex 아키텍처에 문제가 있는 것 아닌가요?SWF를 웹 브라우저로 보내는 유일한 방법이 있습니까?

도움이 되었습니까?

해결책

...Flex 아키텍처의 문제가 아닌가요?

예, 그렇습니다. 또한 일반적으로 Flash에도 영향을 미칩니다.혜택을 받을 수 있을 때까지 로더.언로드앤스톱() FP10(AIR 1.5)의 메서드를 사용하더라도 외부에서 로드된 내용이 메모리 및 CPU 리소스를 계속 소비하지 않는다고 보장할 수 없습니다. Loader.unload() 방법.(솔직히, 그것마저도 자원의 해방이 보장될 것이라고 100% 확신할 수는 없지만, 어쩌면 비관주의자일 수도 있습니다.)

차선책은 로드하는 콘텐츠의 제작자가 다음과 같은 것을 노출하는 것을 포함하여 일련의 지침을 준수하도록 주장하는 것입니다. dispose() 앱이 호출하기 전에 최대한 많은 리소스를 해제하도록 요청하기 위해 호출할 수 있는 메서드 unload() 그것.이것이 가능하지 않으면 외부 SWF를 로드할 때마다 애플리케이션의 메모리 및 CPU 사용량이 거의 확실히 부풀어오르게 됩니다.죄송합니다.

기분이 좀 나아진다면 혼자가 아닙니다.;)

다른 팁

잘못 작성된 SWF가 응용 프로그램을 싱크할 수 있다는 것은 문제이며, 다른 사람들이 언급한 것처럼 이와 관련된 많은 문제는 Flash Player 10에서 해결될 것입니다.그러나 플랫폼에 관계없이 타사 코드를 로드하면 항상 문제가 발생할 위험이 있으며, 버그, 메모리 누수 또는 완전히 악성 코드가 포함될 가능성이 항상 있습니다.콘텐츠를 샌드박스에 로드할 수 없는 한(적어도 아직은 Flash에서는 로드할 수 없음), 잘못된 항목을 로드하면 앱이 싱크됩니다. 그렇게 간단합니다.

안타깝지만 로드된 콘텐츠의 품질을 보장할 수 없다면 자신의 애플리케이션의 품질도 보장할 수 없습니다.Flash 개발자는 누출되거나 언로드될 수 없는 항목을 작성하는 것으로 악명 높습니다. 왜냐하면 Flash를 사용하면 특히 타임라인에 따라 실행되는 작업에 대해 잘못된 작업을 수행하기가 쉽기 때문입니다.직접 제어할 수 없는 Flash 콘텐츠를 로드하는 것은 매우 위험합니다.

가장 좋은 해결책은

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

이런 방식으로 플레이어를 중지하고 메모리에서 콘텐츠를 언로드하여 사운드가 계속 재생되는 것을 방지합니다.건배

문제는 로드된 SWF에 있으며 오디오 자체를 정리하지 않습니다.다음과 같이 영화 클립에 언로드 이벤트를 연결해 보세요.

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

나는 일반적으로 SWFLoader를 멀리하고 mx.modules 패키지의 클래스를 사용합니다.

Flex에는 이러한 유형의 동작을 가능하게 하는 모듈 시스템이 있습니다.여기에서 확인할 수 있습니다. http://livedocs.adobe.com/flex/3/html/help.html?content=modular_3.html .일반적으로 swf 구성 요소를 동적으로 로드하고 언로드하는 것은 까다롭습니다. 특히 해당 모듈이 응용 프로그램의 전역 상태(스타일 등)를 수정하는 경우 더욱 그렇습니다.그러나 모듈에 대한 인터페이스를 생성한 다음 로드/언로드하는 각 클래스가 해당 인터페이스를 구현하고 flex 모듈 클래스를 확장하면 해당 클래스를 깔끔하게 로드 및 언로드할 수 있습니다.

다음을 시도해 보세요:

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

그러면 가비지 수집 루틴이 강제 실행됩니다.SWF가 여전히 연결되어 있다면 오디오와 같은 일종의 연결이 누락된 것입니다.

GC를 강제하는 방법에는 몇 가지가 있습니다. CPU 사용량이 급증하기 때문에 짜증나는 일이지만, 좋은 소식은 공식적인 방법이 Flash Player 10에 등장한다는 것입니다.

unloadAndStop

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

그때까지는 위에 보여드린 것처럼 해킹으로 강제로 실행해야 할 것 같습니다.

코드 전체를 표시하지 않았으므로 Loader 클래스의 unload 메서드를 사용하지 않았다고 가정하겠습니다.또한 swfLoader.load(null)은 로드 메소드가 URLRequest 객체를 기대하기 때문에 잘못된 것 같습니다.마지막에 내용을 정리하려면 null 로드를 호출하는 대신 개체 값을 null로 설정하세요.오디오가 여전히 들리는 것은 데이터가 언로드되지 않았거나 오디오 파일이 언로드된 콘텐츠 내에 있지 않음을 나타냅니다.이를 살펴보겠습니다.

아래 예


var loader:Loader = new Loader();
var request:URLRequest = new URLRequest('test.swf');
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfLoad, false, 0, true);

함수 onswfload (e : event) : void {addChild (로더);loader.contentLoaderInfo.addEventListener(Event.UNLOAD, onLoaderUnload, false, 0, true);

loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onSwfLoad, false);} 함수 onloaderUnload (e : event) : void {trace ( '로더가 성공적으로 언로드되었습니다.');} // 이제 버튼을 클릭하여 버튼을 클릭하여 이것을 제거하려면 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); }

이것이 도움이 되었기를 바랍니다. 중복되었다면 죄송합니다. 그러나 귀하의 코드를 보지 않고서는 귀하가 이 문제에 어떻게 접근했는지 정확히 알 수 있는 방법이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top