{lang: 'de'}
Flashhilfe.de - Flash Community

Externe geladene Filme vollständig entladen [Flash 11]

 


AntwortenRegistrieren Seite1  

break-Flash-break#1
Benutzerbild von break-Flash-break
Beiträge: 0
Registriert: May 2019

07.05.2019, 11:09

Hi Leute,

da ich bisher nichts gefunden, was mir weiterhilft, frage ich euch mal direkt.

Ich habe eine Haupt-SWF von der aus ich Untermenüs (SWF) lade in denen wiederum bei Klick auf bestimmten Buttons Videoclips abgespielt werden.
Die Videos werden extern geladen mit FlashPlayBack-Komponente.
Also die Movieclips der einzelnen Videos (mit URL in Video-Ordner) liegen auf separaten Ebenen und sind unsichtbar geschaltet und werden mit Klick auf den jeweiligen Button gestartet.

Dann habe ich den Stop-Button der FLVPlayBack per Actionscript angesprochen, dass r ein Schließen des Videoclips erzwingt. Alles soweit funktioniert prima. Da ich aber mehere Untermenüs mit jeweils mindestens 6 Clips habe und ich springe zwischen den einzelnen Menüs hin und her, stürzt die EXE oder auch die SWF spätestens nach dem 3. Menü ab.

Laut Task-Manager schaukelt sich das ganze immer höher. Leider werden beim Schließen der Untermenüs die Videos nicht mit entladen. Vermute ich mal. Diese werden mit unloadandStop
+ zusätzlich removeChild geschlossen.

Kann mir vielleicht jemand weiterhelfen, wie ich die Videos vollständig entladen kann oder gibt es da einen sinnvolleren Weg die Videos zu laden? FLVPlayback sollte aber mit rein.

Achso, die Menüs werden mit dispatchEvent abgefangen und geschlossen. Hier ein Beispiel:

//Laden eines Untermenüs
btn_freeline.addEventListener(MouseEvent.CLICK, playfreeline);

function playfreeline(e:MouseEvent):void{
   var loadfreeline = new Loader();
   loadfreeline.load(new URLRequest("Menuefreeline.swf"))
   addChild(loadfreeline);
   loadfreeline.addEventListener("swfAmEnde", entladefreeline);

          function entladefreeline(event:Event)
            {
               loadfreeline.unloadAndStop();
            removeChild(loadfreeline);
            loadfreeline.removeEventListener("swfAmEnde", entladefreeline);
            loadfreeline = null;
            }
         }

//AS3 im Untermenü
freeline_Gesamt_EN.stop();
freeline_Gesamt_EN.visible= false;

btn_startmenue.addEventListener(MouseEvent.CLICK, startmenue);

function startmenue(e:MouseEvent):void{
   dispatchEvent(new Event("swfAmEnde", true));
}

btn_gesamt.addEventListener(MouseEvent.CLICK, playgesamt);
      
function playgesamt(e:MouseEvent):void{
   freeline_Gesamt_EN.visible= true;
   freeline_Gesamt_EN.play();
   freeline_Gesamt_EN.stopButton.addEventListener(MouseEvent.CLICK, GesamtStop);
}

function GesamtStop(e:MouseEvent):void{
   freeline_Gesamt_EN.visible= false;
   freeline_Gesamt_EN.stop();
   
}
Indy_Crossover#2
Benutzerbild von Indy_Crossover
Beiträge: 59
Wohnort: Emmendingen
Registriert: Oct 2018

09.05.2019, 14:23

Hallo, break-Flash-break,

das Hauptproblem an diesem Programm scheint zu sein, dass du versuchst, eine Funktion innerhalb einer anderen Funktion zu definieren. (entladefreeline in playfreeline)
Prinzipiell ist das in Adobe Flash wahrscheinlich möglich: die innere Funktion wird als lokale Variable betrachtet, die von der äußeren Funktion verwendet wird. Der Haken daran ist allerdings:
entladefreeline hat bei jedem Aufruf von playfreeline einen anderen Wert.
Wenn 'entladefreeline' aufgerufen wird, dann versucht diese Funktion, 'entladefreeline' durch removeEventListener zu entfernen, dieses ist aber möglicherweise ein anderes 'entladefreeline', als durch das addEventListener in 'playfreeline' vorher eingesetzt wurde, weil es sich eben um eine lokale Variable handelt.
Meine vorgeschlagene Maßnahme: definiere 'entladefreeline' lieber als globale Funktion, indem du die zweite Klammer } hinter die addEventListener-Zeile von playfreeline verschiebst. Die Auswirkung wäre, dass es nur noch ein 'entladefreeline' gibt und somit keine Verwechslung mehr möglich ist.
Wenn du mehrere verschiedene Werte für die Variable loadfreeline hast, kannst du in der Funktion entladefreeline jedes der vier 'loadfreeline' durch 'event.currentTarget' ersetzen. Dadurch kriegst du bei jedem Aufruf der Funktion den richtigen Loader, der ihn ursprünglich ausgelöst hat.

Weiterhin würde ich die Reihenfolge der Kommandos vertauschen:
            loadfreeline.removeEventListener("swfAmEnde", entladefreeline);
            removeChild(loadfreeline);
            loadfreeline.unloadAndStop();
            loadfreeline = null;

Begründung:
Den EventListener zu entfernen hat obere Priorität, weil die Funktion nicht mehrmals aufgerufen werden sollte.
removeChild (das Objekt unsichtbar machen) kommt vor unloadAndStop (das Objekt entsorgen), weil die Löschung des Objekts den Benutzer nicht interessiert und deshalb im Hintergrund stattfinden kann.

Ein weiterer Rat von mir ist, in der Funktion playgesamt das addEventListener rauszunehmen und nur ein Mal ganz am Anfang aufzurufen. Zu diesem addEventListener gibt es nämlich kein removeEventListener. Eine Alternative dazu wäre, das zugehörige removeEventListener in der Funktion GesamtStop einzusetzen (bitte nicht beides gleichzeitig!), aber ich halte es für geeigneter und übersichtlicher, addEventListener nur ein Mal aufzurufen.

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   phpwelt.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Impressum
© 1999-2024 Sebastian Wichmann - Flashhilfe.de