2008-09-22 7 views
3

외부 SWF 파일을로드하고 SWFLoader Flex component을 통해 Adobe Flex/Air 응용 프로그램 내에서 재생하는 응용 프로그램이 있습니다. 버튼 클릭 이벤트에서 언로드하는 방법을 찾으려고 노력해 왔습니다. 나는 구글을 멀리하고 해킹없이 해낼 수 있었던 것 같다. 사람들이 사용 내가 볼 코드의 조합은 다음과 같습니다Adobe Flex의 SWFLoader 구성 요소에서 외부로드 SWF 파일을 언로드하려면 어떻게해야합니까?

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 만 웹 브라우저로 보내는 유일한 방법입니까?

+0

편집입니다 : 플래시 버그처럼 보인다 9. 희망적으로 고쳐 씀 : D – Shawn

답변

6

...하지 그 플렉스 아키텍처에 문제가?

예 그렇습니다, 또한 일반적으로 플래시에 영향을 미친다. FP10 (AIR 1.5)에서 Loader.unloadAndStop() 메서드를 사용할 수있게 될 때까지 Loader.unload() 메서드를 사용하더라도 외부로드 된 내용이 메모리 및 CPU 리소스를 계속 사용하지 않는다고 보장 할 수 없습니다. (솔직히 말해서, 리소스를 확보한다고해도 100 % 확신 할 수는 없겠지만, 아마도 비관 주의자 일 것입니다.)

다음으로 가장 좋은 것은 콘텐츠 제작자 로드는 앱이 unload() 전에 최대한 많은 리소스를 공개하도록 요청할 수있는 dispose() 메소드와 같은 것을 노출하는 것을 포함하여 일련의 가이드 라인을 준수합니다. 이것이 가능하지 않다면, 애플리케이션이 외부 swf를로드 할 때마다 메모리와 CPU 사용량이 거의 팽창합니다. 죄송합니다.

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

+0

실제로 Loader.unloadAndStop()가 실패한 후이 게시물을 찾았습니다. 시야에 희망이 없다! – buddyp450

+0

이상한 당신은 정교 할 수 있습니까? 하나도 존재하지 않는다면 질문 할 수도 있습니다. – aaaidan

1

문제는로드 된 swf에 있으며 단순히 오디오 자체를 정리하지 않습니다. 같은 동영상 클립에 unload 이벤트를 연결하십시오 :

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

은 다음을 시도해보십시오 가비지 수집 루틴을 강제

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

합니다. SWF가 여전히 연결되어있는 경우 오디오와 같은 연결을 놓친 것입니다.

은 CPU 스파이크 때문에 모든 종류의 빨아 GC를 강제로 몇 가지 방법이 있습니다,하지만 좋은 소식은 공식적인 방법은 플래시 플레이어 10에서오고 있다는 것입니다 :

unloadAndStop 

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

그 때까지, 내가 위에서 보여 주듯이 당신이 해킹으로 그것을 강요해야 할 것 같네요.

+0

GC 해킹이 나에게 모범 사례가 아닌 것 같습니다. 더 의미있는 메모리 사용 가치를 얻으려면 개발 환경에서 사용하는 것이 좋습니다. 생산에 의존하면 나중에 후회할 수도 있습니다. – aaaidan

0

모든 코드가 표시되지 않았으므로 로더 클래스의 언로드 메서드를 사용하지 않았다고 가정합니다. 또한 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);

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

나는 이것이 도움이 되었으면 좋겠다. 그리고 그것이 중복된다면 나는 유감 스럽지만 코드를 보지 않고서 나는 당신이 이것을 어떻게 접근했는지 정확하게 알 길이 없다.

+0

로더를 사용하지 않고 Flex SWFLoader 구성 요소를 사용하고 있습니다. 내일 아침에 로더 클래스에 시험해 보겠습니다. 고마워 ... – Shawn

2

잘못 작성된 SWF가 응용 프로그램을 가라 앉게하고 다른 문제가 언급 한 것처럼 Flash Player 10에서이 문제 중 상당 부분이 수정되는 문제가 있습니다. 그러나 플랫폼에 관계없이 타사 코드를로드하면 항상 문제가 발생할 위험이 있습니다. 버그, 메모리 누수 또는 악의적 인 코드가 포함될 가능성은 항상 있습니다. 샌드 박스에 콘텐츠를로드 할 수있는 경우가 아니라면 (적어도 플래시에서는 불가능 함) 나쁜 콘텐츠를로드하면 앱이 중단되며 간단합니다.

난 당신이로드 된 내용의 품질을 보장 ​​할 수 없다면 당신은 당신의 자신의 응용 프로그램의 품질을 보장 ​​드릴 수 없습니다. 플래시 개발자는 누출되거나 언로드 할 수없는 작업을 작성하는 것으로 유명합니다. Flash는 특히 타임 라인에있는 것들에 대해 잘못된 작업을 쉽게하기 때문에 누출되거나 삭제 될 수 없습니다. 직접 제어 할 수없는 플래시 컨텐츠를로드하는 것은 매우 위험합니다.

1

저는 일반적으로 SWFLoader에서 멀어지고 mx.modules 패키지의 클래스를 사용합니다.

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

2

가장 좋은 방법은

플레이어를 중지 이런 식으로
swfLoader.autoLoad = false; 
swfLoader.unloadAndStop(); 
swfLoader.autoLoad = true; 

, 메모리에서 콘텐츠를 언로드하고 재생 남아 소리를 피하기 .. 건배