2010-11-25 5 views
0

이 코드를 사용하면 f4v 파일의 재생이 일찍 중단됩니다. 시간은 변경되지만 대략 8-10 초입니다.함수를 사용할 때 이상한 NetStream 문제가 발생했습니다.

loadSong(); 

    function loadSong() 
    { 
     if(!songPlaying) 
     { 
      songPlaying = true; 
      var customClient:Object = new Object(); 
      customClient.onCuePoint = cuePointHandler; 
      customClient.onMetaData = metaDataHandler; 

      var nc:NetConnection = new NetConnection(); 
      nc.connect(null); 
      var ns:NetStream = new NetStream(nc); 
      ns.client = customClient; 
      ns.play("song.f4v"); 
     } 

      trace("HERE"); 

    } 


    function cuePointHandler(infoObject:Object):void{ 
    trace(infoObject.name); 
    } 
    function metaDataHandler(infoObject:Object):void { 
    trace("metaData"); 
    } 

이 코드는 f4v를 끝까지 재생 합니다. WTF !? 그것은 함수를 통해 호출 할 때 문제가 발생하는 것 같습니다. 참고로 코드는 기본 타임 라인의 첫 번째 프레임에 저장되며 F4v는 오디오 전용입니다. 어떤 도움을 주시면 감사하겠습니다.

무슨 일이 일어나고 무엇
if(!songPlaying) 
{ 
    songPlaying = true; 
    var customClient:Object = new Object(); 
    customClient.onCuePoint = cuePointHandler; 
    customClient.onMetaData = metaDataHandler; 

    var nc:NetConnection = new NetConnection(); 
    nc.connect(null); 
    var ns:NetStream = new NetStream(nc); 
    ns.client = customClient; 
    ns.play("song.f4v"); 
} 

답변

3

, 당신은 함수 내에서 당신의 NetConectionNetStream을 선언, 그 변수의 범위는 그 함수에 로컬 때문이다. 즉, 사용자가 만든 NetConnection을 참조하는 다른 사람이 없으므로 가비지 수집기가 다음 실행 중에 스윕됩니다 (그 때문에 당신은 가변 시간을 보게됩니다).

변수를 if 문으로 선언하면 변수가 무비의 범위에 있고 변수에 대한 참조를 보유하므로 가비지 수집되지 않습니다.

나머지 코드에 대한 아키텍처가 무엇인지 모르겠지만 코드를 유지하는 함수를 사용하려면 loadSong(); 문 바로 앞에 var nc:NetConnection = new NetConnection();에 대한 선언을 넣어보십시오.

구조적으로 코드를 프레임 밖으로 리팩터링하고 싶을 수도 있지만 코드 라인이 두 줄이면 실제로 가치가 없을 수도 있습니다. 프로젝트에 따라 다릅니다.

가비지 수집에 대한 자세한 내용은 Understanding garbage collection in Flash Player 9 (Flash Player 9에 설명되어 있지만 10에도 적용 가능)을 확인하십시오.

+0

마틴이 정말 감사합니다. 그렇게 바보 같은 실수입니다! – Chris

관련 문제