2010-11-25 33 views
0

Ce code provoque l'arrêt prématuré de la lecture de mon fichier f4v. Le temps change mais à peu près 8-10 secondes.Problème Bizarre NetStream lors de l'utilisation de la fonction

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

Ce code laisse jouer le f4v jusqu'à la fin. WTF !? Il semble que lorsque je l'appelle via une fonction, cela provoque le problème. Pour info, le code est stocké dans la première image du scénario principal, et le F4v est uniquement audio. Toute aide serait appréciée.

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

Répondre

3

Ce qui se passe, lorsque vous déclarez votre NetConection et NetStream dans la fonction, est que la portée de cette variable est locale à cette fonction. Cela signifie que rien d'autre ne fait référence au NetConnection que vous avez créé et que le ramasse-miettes le balaie lors de sa prochaine exécution (c'est la raison pour laquelle vous voyez le temps variable).

Lorsque vous le déclarez dans une simple instruction if, les variables se trouvent dans la portée de l'animation et contiennent une référence et ne sont donc pas récupérées. Je ne sais pas quelle est l'architecture pour le reste de votre code, mais si vous voulez utiliser des fonctions pour contenir votre code, essayez de mettre une déclaration pour le var nc:NetConnection = new NetConnection(); juste avant l'instruction loadSong();. Du point de vue de l'architecture, vous voudrez peut-être refactoriser votre code hors du cadre, mais cela pourrait ne pas valoir le coup, si ce n'est que quelques lignes de code. Tout dépend de votre projet.

Pour plus d'informations sur la récupération de place, consultez Understanding garbage collection in Flash Player 9 (Flash Player 9, mais cela s'applique également à 10).

+0

Parfait merci tellement martineno, c'est une erreur tellement bête d'avoir fait! – Chris