2010-11-25 7 views
0

Dieser Code führt dazu, dass meine f4v-Datei nicht mehr vorzeitig abgespielt wird. Zeit ändert sich aber ungefähr 8-10 Sekunden in.Weird NetStream-Problem bei der Verwendung der Funktion

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

Dieser Code lässt uns das F4V bis zum Ende abspielen. WTF !? Es scheint, dass wenn ich es über eine Funktion anrufe, es das Problem verursacht. FYI der Code wird im ersten Frame der Hauptzeitleiste gespeichert, und der F4v ist nur Audio. Jede Hilfe wäre willkommen.

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

Antwort

3

Was geschieht, wenn Sie Ihre NetConection und NetStream innerhalb der Funktion zu erklären ist, dass der Spielraum für diese Variable auf diese Funktion lokal ist. Das bedeutet, dass nichts anderes auf die NetConnection verweist, die Sie erstellt haben, und der Garbage Collector daher beim nächsten Durchlauf die Daten abfängt (deshalb sehen Sie die Variable time).

Wenn Sie es in nur einer if-Anweisung deklarieren, sind die Variablen im Bereich des Films und das enthält einen Verweis auf sie und damit sind keine Müll gesammelt.

Ich weiß nicht, was die Architektur für den Rest Ihres Codes ist, aber wenn Sie Funktionen verwenden möchten, um Ihren Code zu halten, versuchen Sie eine Deklaration für die var nc:NetConnection = new NetConnection(); kurz vor der loadSong(); Anweisung.

Architektonisch könnten Sie Ihren Code aus dem Rahmen umgestalten, aber es lohnt sich möglicherweise nicht, wenn es nur ein paar Zeilen Code ist. Kommt nur auf dein Projekt an.

Weitere Informationen zur Garbage Collection finden Sie unter Understanding garbage collection in Flash Player 9 (Flash Player 9, aber auch 10).

+0

Perfect vielen Dank Martineno, es ist so ein dummer Fehler gemacht zu haben! – Chris