Observer löst zweimal aus

Garm

Mitglied
Ahoi.

Ich habe auf anraten eines Forenkollegen ein Problem mit einem Observer und Observable gelöst.

Vorab: es funzt.

Problem: die Aktion in

Java:
update()
{...}

wird zweimal hintereinander ausgelöst.

Ich habe (vermeintlich) alles gecheckt und keinen doppelten Aufruf gefunden.
Gibts da etwas, dass ich wissen sollte oder übersehe ich wahrscheinlich einen meiner Fehler?

cya
Garm
 
Ahoi.

Hrm? Breakpoint? Stracktrace?

Ich habe nur eine Observable in der die notify-Methode sitzt. Ich weiß also, wer das update auslöst. Aber es wird halt trotzdem zweimal ausgelöst 😉

cya
 
Wie ich bereits sagte
[EDIT]Du kannst einen Breakpoint auf deine update()-Methode setzen und dir den Stacktrace anschauen, von wem der Aufruf kam.[/EDIT]
 
Ich habe den Stacktrace nach dieser Anleitung in meine Update-methode reingepackt und es kam das erwartete:

Die einzige notifyObservers()-Methode, die in meinem Programm läuft, sagt das Update zweimal an.

Das ist das, was ich im wesentlichen vorher schon wusste. Wie finde ich nun heraus, warum das passiert?

Die Ausgabe des Stacktrace in Netbeans:
Java:
run:
getStackTrace
update
notifyObservers
watchMarketCache // die Methode, in der notifyObservers() sitzt (ein zweiter Thread)
run
run
getStackTrace
update
notifyObservers
watchMarketCache
run
run

Kann es evtl sein, dass ich irgendwie den Thread zweimal starte?

Meine main() sieht in etwa so aus:
Java:
        public static void main(String args[]) 
        {
           
            java.awt.EventQueue.invokeLater(new Runnable() 
            {
                @Override
                public void run() 
                {
                    ...andere Klassen instanzieren...
                    pruefer = new Pruefer(rechner, view);  // Pruefer ist mein Watchdog und muss in einem eigenen Thread laufen

                    Thread prueferthread = new Thread(pruefer); // als implements Runnable
                    prueferthread.start();                                
                    
                    ...anderes zeug machen...
                }
            });

Was ich machen wollte: Ein Objekt von Pruefer() instanzieren und "in einen Thread stecken".

Ist das auch das, was ich getan habe?
 
Ahoi, Buben und Maiden.

Zuforderst: Ein wundervolles altes Jahr mit neuer Seriennummer.

Genug der schönen Worte 😉 Gibts in dem obigen Post irgendeinen Anhaltspunkt für die Herkunft der doppelten Oberserver/Observable-Auslösung?

cya,
Euer herzallerliebster Neujahrsgarm
 
Zuletzt bearbeitet:
Zeig mal mehr Code..der Konstruktor der Klasse Pruefer wäre wohl interessant.

Ich vermute du rufst im Konstruktor irgendwo update auf und beim Start des Threads im Runnable nochmal..
 
Ich bitte um Hilfe und verzögere dann selbst. Das ist natürlich nicht die feine Art. Sorry dafür 😉

Der Konstruktor von Pruefer könnte uninteressanter kaum sein:

Java:
public Pruefer(Rechenknecht rechner, GUI view)
    {
        this._rechner = rechner;
        this._view = view;
    }

Wie gesagt, ich habe das ganze Prog selbst geschrieben und ich rufe das update nirgends "manuell" auf. Das erledigt die Instanz von Pruefer(rechner, view), in der der Observer steckt.

cya
 

Neue Themen


Zurück
Oben