2 Observable und ein Observer...

Goldfish

Bekanntes Mitglied
Hallo Leute, ich hab mal wieder ein kleines Problem, dass sich mir nicht erschließt.
Ich habe 2 unterschiedliche Observable Klassen und eine andere Klasse soll beide beobachten. Wenn ich jetzt in der Observable loslege und meine gewünschte Liste ändere, setz ich das Flag mit setChanged() und informiere alle Observer. Nur dummerweise, kommt beim Observer selber nie was an, obwohl ich laut meiner Testausgaben am notifyObservers(...) vorbeikomme.
Die Observer Klasse ist zu dem auch der einzige Observer des Observable. Und die Testausgabe countObservers liefert mir auch den Wert 1 und da ich sonst keine Klass ehinzugefügt habe, ist das Ergebnis ja schlüssig. Aber seltsamerweise kommt bei der update Funktion meines Observers nie was an... nur die Änderungen der anderen Observable Klasse werden angenommen... kann man mit einer Klasse nur ein Objekt zur Zeit beobachten? oder woran kann das liegen?

[JAVA=42]

public UserRoom( ...){
games = new GameManagement();
games.addObserver(this);
users = new UserManagement();
initializeBoxes();
...
}


public class GameManagement extends Observable{

......

Request r;
public void addActiveGame(Game game){
activeGames.add(game);
// creates a request to notify the activeGamesList
r = new Request(RequestType.ACTIVEGAME);
r.set(RequestKey.ADDACTIVEGAME,true);
setChanged();
notifyObservers(r);
}
public void removeActiveGame(Game game){
activeGames.remove(game);
// creates a request to notify the activeGamesList
r = new Request(RequestType.ACTIVEGAME);
r.set(RequestKey.ADDACTIVEGAME,false);
setChanged();
notifyObservers(r);
}
}
[/code]
 
In deinem Code erkennt man nur ein Observable nämlich GameManagement.
Dieses registrierst du mit games.addObserver(this); , was ist mit dem anderen Observable? Ist das die Klasse UserManagement? Dann fehlt da wohl noch ein users.addObserver(this); oder nicht? ???:L

kann man mit einer Klasse nur ein Objekt zur Zeit beobachten?
Nein eig. nicht 🙂
 
ne, das andere hab ich einfach rausgelassen aus dem Codestück, weil ichs nicht für so wichtig gehalten hab ^^
das andere ruft sich einfach über den Aufruf eines anderen Objektes auf.

ns.getMessageBoard().setRequest(r);

und das folgt eigentlich unmittelbar nach dem anderen Aufruf, also da wo die Pünktchen sind ^^

kann man mit einer Klasse nur ein Objekt zur Zeit beobachten?
Nein eig. nicht

Dann frage ich dazu mal noch. Könnte es sein, dass sich das notifyObservers() bei Nebenläufigkeit in so einem Fall vielleicht in die Haare bekommt und dass es deshalb nicht klappt?
Das MessageBoard ist das andere Observable Objekt. Und das bekommt in unregelmäßigen Zeitabständen (bei mir gerade noch in regelmäßigen, wegen eines Testdummys) den Wert geändert und informiert dann die Observer. Unschönerweise hab ich es in diesem Moment in etwa so, wenn ich das in meinem Programmcode richtig sehe, dass die beiden update extrem zeitnah ausgerufen werden. Also wenns daran nicht liegt, bin ich mehr als überfragt... und wenns daran liegt, weiß ich nicht, wie ichs lösen soll XD
 
ne, das andere hab ich einfach rausgelassen aus dem Codestück, weil ichs nicht für so wichtig gehalten hab ^^
das andere ruft sich einfach über den Aufruf eines anderen Objektes auf.

ns.getMessageBoard().setRequest(r);

und das folgt eigentlich unmittelbar nach dem anderen Aufruf, also da wo die Pünktchen sind ^^

Nur nochmal deutlich damit wir nicht aneinander vorbei reden: Ich rede NICHT vom
Code:
notifyObservers
-Aufruf sondern vom
Code:
addObserver
(this) Aufruf!

ns.getMessageBoard().setRequest(r); <-- Bei dem Aufruf übergibst du doch weder
Code:
this
, noch
Code:
users
?! ;/ Wie kannst du dann also
Code:
this
(bzw dieses eine Objekt) als
Code:
Observer
irgendwo registrieren? :bahnhof:

(ist schon ziemlich spät..joah ... 😀)
edit: Bekommst du es evtl. hin das Ganze in einem minimalen ausführbarem Beispiel darzustellen?
 
sorry ich hab gepennt, als ich das geschrieben hab XD
das sieht so aus XD
ns.getMessageBoard().addObserver(this);

Und das funktioniert ja auch hervorragend. Es geht ja um das andere, das meckert. Ich hab eben auch schon festgestellt, dass es nur nicht geht, wenn ich es an genau dieser einen Stelle aufrufe. Wenn ich das über nen anderen Button mache, klappt es, warum auch immer...

Also das in einem kleinen Beispiel auszuführen krieg ich bestimmt hin ^^
Wir nehmen das, was wir vorhin schon hatten und das hier, ich habs mal eben etwas umgeändert.
[JAVA=42]
private void makeMeObserver(){
ns.getMessageBoard().addObserver(this);
// this class will be the only observer of GameManagement to watch the
// activeGameList.
games.addObserver(this);
}
[/code]

Das ist jetzt die Funktion die die Klasse UserRoom zum Observer von beiden Klassen dort macht.

jetzt ist die Sache die:
in einer anderen Klasse, hab ich ebenfalls eine Instanz von... oh... ist echt spät... ich weiß was los ist XD schön das man drüber reden konnte ^^
In einer anderen Klasse, hab ich ebenfalls eine Instanz dieser Klasse erstellt und versuche dann das Ereignis auszulösen. Hat wer das Problem entdeckt? XD ich hab zwei Instanzen der Klasse und beobachte die falsche XDDD Doofheit tut halt weh XD

Danke soweit XD
 

Zurück
Oben