Wie implementiere ich ein Beobachter, um Daten von einem listener?
Ich bin mit dem MaterialDrawer - Bibliothek zum erstellen einer einfachen Schublade für meine app, einige der Instanzen von Klassen in der Bibliothek müssen Sie eine Zeichenfolge übergeben, in Ihnen, wenn Sie aufgerufen. Ein Beispiel ist die IProfile
Klasse:
IProfile profile = new ProfileDrawerItem().withName("John Doe");
wo die withName()
- Methode nimmt eine Zeichenfolge.
Habe ich eine Klasse MyObservable.java
(extends Observable) Klasse, die ich beabsichtige zu bekommen Daten verwendet werden, in meinem MainActivity
hat die MaterialDrawer Bibliothek implementiert. In dieser Klasse habe ich eine Methode implementData()
hat meine Zuhörer für das, was ich von meinen FB-Datenbank.
Dies ist, wie es aussieht:
public class MyObservable extends Observable {
//Attach our firebase reference...
Firebase userRef = new Firebase("https://myApp.firebaseio.com/users");
AuthData authData;
public String username = "";
public String email = "";
public void changeUsername(String username) {
this.username = username;
setChanged();
notifyObservers(username);
}
public void implementData(){
//Get the authentication data of our user from the reference.
authData = userRef.getAuth();
//This is the listener I have to get the data from.
userRef.child(authData.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
UserSchema user = snapshot.getValue(UserSchema.class);
//This guy needs to be used in the MainActivity appDrawer() method
String userName = user.getName();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
}
class MyObserver implements Observer {
public void update(Observable observable, Object data) {
//For now I just print it out to System.out
System.out.println("Username:" + data);
}
}
Dann ich informieren, mein Beobachter den Benutzernamen zu ändern mit der changeUsername()
Methode:
public void changeUsername(String username) {
this.username = username;
setChanged();
notifyObservers(username);
}
In der MyObservable Klasse, ich habe eine MyObserver
Klasse, die Observer
mit der update()
- Methode aufgerufen, wenn ein Beobachter wurde aktualisiert. In der update()
Methode für jetzt, ich Drucke einfach die username
des Anwenders, sicherzustellen, dass so etwas tatsächlich geschieht.
Dies ist, wo ich noch die Daten aus dem Beobachter (In der MainActivity):
public class MainActivity extends AppCompatActivity {
...
public void appDrawer(){
IProfile profile = new ProfileDrawerItem()
//I need the user's data here
.withName("Test")
.withEmail("[email protected]")
.withIcon(R.drawable.avatar2);
}
...
}
Habe ich Stunden damit verbracht zu versuchen zu " reagieren", um die Ereignisse in den Hörer, indem Sie versuchen, um Daten abzurufen, die verwendet werden in meiner MainActivity aber ich bin mir nicht sicher, ich bin mit dem Observable/Observer-pattern, richtig, auch da dies ein Asynchrones Ereignis von FB Daten zu erhalten, mit einem Beobachter ist der beste Weg, dies zu tun.
Den appDrawer()
- Methode aufgerufen, in der meine Aktivität onCreate()
.
Wie kann ich Daten abrufen, die vom Hörer mit einem Beobachter, so kann ich es verwenden, woanders?
InformationsquelleAutor Feyisayo Sonubi | 2016-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann ich nicht sagen, durch Ihr design, was wirklich Los ist. Die Benennung einer Klasse
Listener
dann macht esObservable
scheint counter-intuitive. Ein listener hört oder beobachtet. Trotzdem, es klingt wie Sie haben eine andere Klasse in derListener
das ist einObserver
so bin ich ein wenig verloren, aber Sie scheinen unsicher, ob Sie eingeführt haben, das Muster richtig. Das kann ich klar mit einem Beispiel.Den
update
Methode liefert das Objekt, das Sie sind, zu beobachten sowie die Argumente (die Daten, die Sie wollen gemeinsam mit dem Beobachter) Sie ging innotifyObservers()
. Wenn du das getan hast, wie diese, dann sollten Sie sich das Verhalten, das Sie erwarten.Wie Sie sehen können Daten gesendet werden können, um die Beobachter, die innerhalb oder außerhalb des beobachtbaren. Bei der Ausführung der output ist...
notifyObservers(String)
genannt werden sollte, vonchangeMe()
."ist wohl ein wenig einschränkend für mich. Es ist öffentlich es ist also absichtlich ausgesetzt. Ich würde sagen, im Allgemeinen Fall aufrufen
notifyObservers
in jeder Methode, die Veränderungen der Staat kann übertrieben sein. Ich sehe Ihren Punkt aber. In OP ' s Fall ist es egal, da es nur eine Benachrichtigung. Ich werde es Bearbeiten, für Ihr Sehvergnügen und so passt OP ' s code besser.Oh wow, vielen Dank, so kann ich die
changeMe
Methode den string, das aktualisiert wird und stattdessen die Beobachter müssen nicht Hinzugefügt werden innerhalb des beobachtbaren ja?Ich bin mir nicht ganz sicher, ob ich weiß, was du meinst, weil Sie sagen, zurück, und nichts wird hier zurückgegeben. Wenn du meinst "return", um den Betrachter dann ja. Sie können schieben Sie es bis Sie die Kette, indem die Zeichenfolge in
changeMe()
und dann innotifyObservers()
. @geek.xwenn man sich an meinem Beispiel sieht man, dass es egal ist wie erhalten Sie den Wert auf den Betrachter. In Ihrem Beispiel haben Sie eine Methode, die benachrichtigt den Beobachter - gut! - aber man kann nie nennen. Also, wenn sich die Daten ändern, Benachrichtigen Sie den Betrachter. Wenn Sie brauchen Ihre Haupttätigkeit um die Ansicht zu aktualisieren sofort, die Haupttätigkeit wird sein müssen, den Beobachter zu oder es muss eine Instanz des Beobachters, die in der Lage sein wird zu ziehen der die meisten up-to-date Benutzernamen oder weitergegeben werden, als Referenz, so kann die Aktualisierung der Ansicht (glaube ich :)).
InformationsquelleAutor ChiefTwoPencils