Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 27-08-2009, 10:57   #1 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
Klasse muss für URLLoader erben?

Hab ne Klasse XMLLoader, die von EventDispatcher erbt und mit einer URLLoader-Instanz eine xml-Datei lädt.

Nutze ich diese Klasse XMLLoader in der Timeline, funktioniert alles.
Setze ich diese Klasse in eine andere Klasse (die von Sprite erbt), wird das Complete-Event der URLLoader-Instanz nicht mehr gefeuert.

Nach 20 min Fehlersuche und reduzierung auf's Kernproblem hab ich irgendwann die Klasse statt von EventDispatcher von Sprite erben lassen, und auf einmal ging es wieder.

Hat jemand eine Erklärung dafür?
__________________
we will stop enhancing the truth in 3, 2, ...
SpecOps-12 ist offline   Mit Zitat antworten
Alt 27-08-2009, 11:32   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Code? Ich würde vermuten, du machst was falsch.
Omega Psi ist offline   Mit Zitat antworten
Alt 27-08-2009, 12:33   #3 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
Ich vermute das auch. Aber ich verstehe es nicht.

Hab mal zum testen noch das ganze "Projekt" angehängt. Ist nicht viel, nur zwei Klassen à 20 Zeilen.

Lässt man wie gesagt in der XMLLoader-Klasse nicht von EventDispatcher sondern von Sprite erben, funktioniert alles.


Timeline:
PHP-Code:
var url:String "xml/album.xml";

var 
xmlLoader:XMLLoader = new XMLLoader(url); // Funktioniert
var album:Album = new Album(url); // Funktioniert nicht 
Klasse "XMLLoader"
PHP-Code:
package {
    
import flash.events.Event;
    
import flash.events.EventDispatcher;
    
import flash.net.URLLoader;
    
import flash.net.URLRequest;

    public class 
XMLLoader extends EventDispatcher {

        private var 
urlLoader:URLLoader;

        public function 
XMLLoader(url:String) {
            
loadXML(url);
        }

        private function 
loadXML(url:String):void {
            
urlLoader = new URLLoader();
            
urlLoader.addEventListener(Event.COMPLETEcompleteHandlerfalse0true);
            
urlLoader.load(new URLRequest(url));
        }

        private function 
completeHandler(e:Event):void {
            
trace('XMLLoader: completeHandler: e: ' + (e));
            
this.dispatchEvent(new Event(Event.COMPLETE));
        }
    }

Klasse "Album"
PHP-Code:
package {
    
import flash.display.Sprite;
    
import flash.events.Event;

    public class 
Album extends Sprite {

        public function 
Album(url String) {
            
init(url);
        }

        private function 
init(url String) : void {
            var 
xmlLoad XMLLoader = new XMLLoader(url);
            
xmlLoad.addEventListener(Event.COMPLETEloadCompleteHandler);
        }

        private function 
loadCompleteHandler(Event) : void {
        }
    }

Angehängte Dateien
Dateityp: zip xml.zip (8,8 KB, 5x aufgerufen)
__________________
we will stop enhancing the truth in 3, 2, ...

Geändert von SpecOps-12 (27-08-2009 um 12:35 Uhr)
SpecOps-12 ist offline   Mit Zitat antworten
Alt 27-08-2009, 12:50   #4 (permalink)
undefined
 
Benutzerbild von mildesign
 
Registriert seit: Jul 2001
Ort: Stuttgart
Beiträge: 1.839
ich würde die load Methode des URLLoaders nicht direkt beim instantiieren aufrufen, sondern diese nochmal von außen über eine zusätzlich Methode anstoßen.

Vermutlich kommt dein Listener zu spät in der Album Klasse.
Ich hoffe Florian korrigiert mich wenn ich da jetzt falsch vermute ;o)

PHP-Code:
private function init(url String) : void {
            var 
xmlLoad XMLLoader = new XMLLoader(url);
            
xmlLoad.addEventListener(Event.COMPLETE
                        
xmlLoad.load(); // <--ruft xmlload.urlloader.load() auf
loadCompleteHandler);
        } 
__________________
mfg Frank

Geändert von mildesign (27-08-2009 um 12:51 Uhr)
mildesign ist offline   Mit Zitat antworten
Alt 27-08-2009, 12:59   #5 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
Das hatte ich zunächst auch vermutet. Aber das Complete-Event wird bereits in der XMLLoader-Klasse schon nicht gefeuert. (Jedoch schon, wenn ich XMLLoader direkt in der Timeline instanziere).

Und was hat es mit der Änderung des Verhaltens auf sich, wenn ich eine andere Erbschaft angebe? Das macht für mich keinen Sinn.
__________________
we will stop enhancing the truth in 3, 2, ...
SpecOps-12 ist offline   Mit Zitat antworten
Alt 27-08-2009, 13:25   #6 (permalink)
hmmm
 
Registriert seit: Dec 2003
Beiträge: 224
änder mal:

PHP-Code:
        public function XMLLoader(url:String) {
            
loadXML(url);
        } 
nach

PHP-Code:
        public function XMLLoader(url:String) {
            
super(this);
            
loadXML(url);
        } 
astrocreep ist offline   Mit Zitat antworten
Alt 27-08-2009, 13:27   #7 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Den Ladevorgang solltest du definitiv über eine eigene Methode anstoßen, egal ob es nun daran liegt, oder nicht.

Hast du mal versucht, das useWeakReference wegzulassen? (warum ist es überhaupt da?) Vielleicht werden DisplayObject Instanzen später eingesammelt? Nur am rumraten ...
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 27-08-2009, 13:46   #8 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
@Janoscharlipp

Das war der richtige Tip.
Es lag am useWeakReference.

Das hab ich mir angewöhnt, das quasi immer auf true zu setzen.

Edit: Ich versteh auch nicht, warum hier der Listener gekickt wird. Die Referenz, auf die der Listener angemeldet wird, bleibt doch bestehen. Der Garbage-Collector dürfte den Listener doch gar nicht einsammeln.
__________________
we will stop enhancing the truth in 3, 2, ...

Geändert von SpecOps-12 (27-08-2009 um 13:54 Uhr)
SpecOps-12 ist offline   Mit Zitat antworten
Alt 27-08-2009, 13:56   #9 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Der Listener ist nur eine Funktion. Es geht um das aufrufende Objekt, dass dann schon weg ist und der Listener nicht mehr aufgerufen werden kann -> es gibt ja keinen Aufrufer mehr.
Omega Psi ist offline   Mit Zitat antworten
Alt 27-08-2009, 14:05   #10 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.649
Ach Alter, die Funktion in der Album-Klasse *vor den Kopf hau*
Die Instanz der XMLLoader-Klasse existiert ja nur im Gültigkeitsbereich der Funtion "init" und ist dann natürlich wieder fort.

Ich habs kapiert.

Eine Frage bleibt noch: Warum funktioniert das ganze trotzdem, wenn die XMLLoader-Klasse von Sprite erbt?
__________________
we will stop enhancing the truth in 3, 2, ...
SpecOps-12 ist offline   Mit Zitat antworten
Alt 27-08-2009, 15:31   #11 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Hatte oben ja schon vermutet, dass DisplayObject's später eingesammelt werden, vielleicht haben sie intern eine Gnadenfrist von einem Frame (da ist sicher auch irgendein init, added, enterFrame oder sonstwas Listener am Werk)
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele