Observer reagieren beim 2ten mal nicht

Status
Nicht offen für weitere Antworten.

babuschka

Top Contributor
Hallo,

ich hab ein kleines Problem mit dem Observer-Pattern.

Undzwar funktioniert das Observer-Pattern schon, aber nur beim ersten mal :-(
Sobald es ein zweites mal ausgeführt wird, reagieren die Observers (2 Stück) nicht mehr.
Code:
1ter Ablauf (richtig):

setChanged->if(hasChanged)->notifyObservers
Observer 1 fürht Code in update aus
Observer 2 macht nix in update
Observer 1 ändert Observable
setChanged->if(hasChanged)->notifyObservers
Observer 1 macht nix in update
Observer 2 fürht Code in update aus
Und das ganze nochmal sobald ein Button geklickt wird.
Jetzt macht er diesen Ablauf nur beim ersten mal. Beim zweiten mal nur soweit:
Code:
2ter Ablauf (falsch):

setChanged->if(hasChanged)->notifyObservers

Versteh echt ned warum keine der updateMethoden der Observers "erreicht" wird :-(
Nicht mal ein System.out.println("bla"); am anfang einer update wird ausgegeben...
Fast so als wenn das "Signal" verloren geht...

Wisst ihr weiter?
 
Hallo,

hab jetzt hier nur die beteiligten methoden drin:

Im Observable
Code:
...
public void setCode(int code) 
{
        setChanged();
        Code = code;
        updateObservers();
}
...
public void updateObservers()
{
    if(Controller.updateDB==true)
    {
	Controller.updateDB=false;
	System.out.println("Gehe nun in update View");
    }
    else if(Controller.updateDB==false)
    {
	Controller.updateDB=true;
	System.out.println("Gehe nun in update DB");
    }
				
    if(hasChanged())
    {
                System.out.println("BLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
                notifyObservers(DTCCode);
    }    
}
....

In Observer 1
Code:
...
public void update( Observable ob,Object arg)
{
        System.out.println("UpdateMehtode-DB");
        if(Controller.updateDB==true)
        {	
	xxx
        }
}
...

In Observer 2
Code:
...
public void update( Observable ob,Object arg)
{
        System.out.println("UpdateMethode-View");
        if(Controller.updateDB==false)
        {
            xxx
        }
}
...


Die bool wird richtig gesetzt, da bin ich mir sicher. Nur wenn das Pattern zum 2ten mal ausgeführt werden soll, kommt auch noch die anzeige Blaaaaa...., aber keine der updates wird erreicht.
Konsolenausgabe:
Code:
Gehe nun in update DB
BLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
UpdateMehtode-DB
Gehe nun in update View
UpdateMethode-View
->Repaint
Gehe nun in update DB
BLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
guck dir die boolean-variablen mit nem debugger an...
und ==true ist überflüssig...
und statt ==false benutze !
 
mhhh....aber nach den notifyObservers werden die update-Methoden der Observers aufgerufen....
in denen mach ich erstmal ein System.out.println() und danach überprüf ich auf die bool

da müsst er doch auch was auf der konsole ausgeben und ned einfach nach "BLAAA..." aufhören oder nicht?
 
anscheinend werden sie eben nicht aufgerufen...was macht notifyObservers? den code davon hast du weggelassen
 
also meine klasse implementiert observable...
in der java-api steht dazu folgendes

notifyObservers():
Code:
notifyObservers

public void notifyObservers()If this object has changed, 
as indicated by the hasChanged method, then notify all 
of its observers and then call the clearChanged method 
to indicate that this object has no longer changed. 
Each observer has its update method called with two arguments: 
this observable object and null. In other words, this method is equivalent to: 

notifyObservers(null)
 
implementiert? du meinst erweitert...
implementieren kann man nur interfaces...
der fehler wird wohl in einem teil des codes liegen, den du noch nicht gepostet hast. bist du mal mit nem debugger durchgegangen? dieses pseudo-debugging mit system.out.println ist völlig unnötig und umständlich.
 
willst du mich veralbern oder so? anstatt auf meine Frage zu antworten willst _du_ _mir_ was über design patterns beibringen? keine MVC-anwendung kommt ohne observer aus...
 
ich hab doch nen observer drin ^^

meineKlasse implements Observer

guck dir halt das bsp im link an....so ist mein aufbau des mvc auch

was gibts da ned zu verstehen?
 
Kim Stebel hat gesagt.:
willst du mich veralbern oder so? anstatt auf meine Frage zu antworten willst _du_ _mir_ was über design patterns beibringen? keine MVC-anwendung kommt ohne observer aus...

Die Frage von ihm bezog sich wohl eher auf die Observer/Observable Implementierung der Java API.

Denn das hier lässt schon schließen, als wenn Du das noch nicht benutzt hast:
Kim Stebel hat gesagt.:
...was macht notifyObservers? den code davon hast du weggelassen

Also kein Grund, so überheblich zu reagieren. ???:L
 
danke byto 🙂

hab nomal den debugger benutzt....hab das problem gefunden, doch ne lösung kenn ich dazu ned

Code:
public void updateObservers() 
{ 
    if(Controller.updateDB==true) 
    { 
   Controller.updateDB=false; 
   System.out.println("Gehe nun in update View"); 
    } 
    else if(Controller.updateDB==false) 
    { 
   Controller.updateDB=true; 
   System.out.println("Gehe nun in update DB"); 
    } 
             
    if(hasChanged()) 
    { 
                System.out.println("BLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); 
                notifyObservers(DTCCode); 
    }    
}

beim ersten durchgang läufts normal und beim 2ten geht er in die if(hasChanged()) rein, gibt blaaa auch noch aus ABER dann geht er auf notifyObservers und macht gar nix mehr danach ^^ die updateMethoden werden nicht aufgerufen, deshalb macht er nix mehr

kann ma ihn dazu zwingen die updates aufzurufen?
bin langsam echt am verzweifeln ^^
 
cmuck hat gesagt.:
beim ersten durchgang läufts normal und beim 2ten geht er in die if(hasChanged()) rein, gibt blaaa auch noch aus ABER dann geht er auf notifyObservers und macht gar nix mehr danach ^^ die updateMethoden werden nicht aufgerufen, deshalb macht er nix mehr

Wenn du beim Debuggen bei notifyObservers stehst - machst du dann "step into"? Kommt er aus dem Methodenaufruf wieder zurück?
Hast du mal Breakpoints auf die beiden Update-Methoden gesetzt?
Kann es sein, dass sich die Observer nach dem ersten Durchgang deregistiert haben? Lass dir doch vor dem Aufruf von notifyObservers() mal das Ergebnis von countObservers() ausgeben.
 
Oder wird vielleicht irgendwo zwischen setChanged() und notifyObservers() ein clearChanged() aufgerufen?
 
Eine gutes Loggingsystem erspart viel Debugging und Verwunderung.

Meine 0.02 €
 
byto hat gesagt.:
Oder wird vielleicht irgendwo zwischen setChanged() und notifyObservers() ein clearChanged() aufgerufen?
nö, das is ned der fall


Murray hat gesagt.:
Kann es sein, dass sich die Observer nach dem ersten Durchgang deregistiert haben? Lass dir doch vor dem Aufruf von notifyObservers() mal das Ergebnis von countObservers() ausgeben.

wow :roll: countObservers ergab vor notifyObservers folgenedes:
1ter durchgang 2
2ter durchgang 0

es sind tatsächlich keine observers mehr angemeldet....trennt er die automatisch, da ich kein deleteObservers ausführe?
 
Problem gelöst 🙂

es lag daran, dass ich im code einmal das bestehende observable-objekt neu zuweise ( observable = new observable)
und dann hatte es die observer gelöscht.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben