warten Sie, bis FB die Daten abruft
Ich bauen möchte, eine Methode, die zurückgibt einen child
Wert in FireBase
. Ich habe versucht, so etwas zu tun:
public String getMessage(){
root.child("MessagesOnLaunch").child("Message").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
message = (String) dataSnapshot.getValue();
Log.i("4r398", "work");
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.e("error", firebaseError.getMessage());
}
});
return message;
}
Das problem ist, dass die Methode gibt null
das ist wahrscheinlich, weil die Methode nicht warten, bis der listener beendet und zurück null
weil seine default-Wert von message
.
Wie kann ich diese Methode warten, bis der Hörer tritt und dann den Rückgabewert.
- übernehmen root gespeichert ist, auf die Klasse (und die Klasse ist nicht gc ' ed ist), es sollte keine Rolle spielen, dass die Funktion abgeschlossen ist
- Sie können nicht synchron Rückkehr eine asynchrone Wert. Die
message
variable hier ist völlig sinnlos, da es nicht an der Zeit, die es gibt--man muss die Daten vom server abgerufenen ersten. Stattdessen getMessage() sollte entweder akzeptieren Sie einen Rückruf von einer Art oder ein Ereignis auslösen. Es ist eine Anleitung für diese Konzepte, chocked voll von Beispielen und Tipps. - mit dieser Antwort. Ich habe vor dem gleichen Problem und gelöst mit EventBus.
InformationsquelleAutor ben | 2015-06-05
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellen eine Schnittstelle
Erklären Sie die folgende Funktion readData()
Aufruf der readData () - Funktion wie folgt
readData() aufgerufen werden kann, in Ihrem getMessage () - Methode oder auch innerhalb von onCreate()
Können Sie CountDownLatch.
Dies ist, wie Sie es verwenden können.
message
ist nicht deklariert. Wenn Sie erklärenmessage
am Anfang der Funktion alsString message = null
es hat erklärt zu werdenfinal
zu oder es wird nicht kompilieren. Und dann ist da seine endgültige kannst du nicht updatenmessage
mehr innerhalbonDataChange
. Das ist so frustrierend. Fast keine Möglichkeit zum abrufen von Daten ausonDataChange
zur Außenwelt in einem sauberen Stück code.public synchronized String getMessage()
zu der Signatur der Methode, um sicherzustellen, dass nur ein thread ist ein Aufruf dieser Methode zu einem Zeitpunkt. Ohne empirische Tests bewiesen, ich war immer die falschemessage
zurückgegeben etwa 10% der Zeit, die beim ausführen dieser Methode parallel (z.B. zwei oder mehr Anfragen kommen in dein servlet in der gleichen Zeit, so dass zwei threads den Aufruf dieser Methode in der gleichen Zeit).Nicht nutzen FB als Funktionen, die Werte zurückgeben - es geht gegen den asynchronen Charakter.
Plan code-Struktur, mit der FB für die Durchführung der Aufgabe, und dann in den Verschluss (blockieren), gehen Sie zum nächsten Schritt.
In deinem code, zum Beispiel, ändern Sie die Funktion nicht etwas zurückzugeben-und in der onDataChange, wie die Letzte Zeile Aufruf der nächsten Funktion zum aktualisieren der Benutzeroberfläche.
Als @CMikeB1 kommentiert eine andere Antwort in der java-Welt, wenn wir den Umgang mit servlets und Dienstleistungen, die Ruhe, die wir verwenden, synchronisieren Aufrufe von Operationen durchführen, wäre es sinnvoll, beide Optionen im sdk FB-admin, so daß der Entwickler wählen, welche zu benutzen ist abhängig von seinem Fall verwenden.
Machte ich meine Umsetzung warten muss, Lesen Sie die sync-Daten mit ApiFuture, die die aktuelle Schnittstelle, verabschiedet von der sdk an die FB-admin. hier ist ein link!
Überlasse ich dies hier, um jedem zu helfen, der Gesichter das gleiche problem wie ich. @Tirupati Singh code sieht nett aus, aber ich schrieb meine Antwort unten sein, warum es für mich nicht funktioniert. Mit Atomarer Typ gearbeitet -
Hinweis: die Funktion kann nur durch die return-message Typ Integer. Ich konnte nicht get it to work for String als keine Atomaren Typ String. Hoffe, das hilft!