2010-11-25 65 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

非常感謝martineno,這是一個愚蠢的錯誤! – Chris 2010-11-25 04:20:29