Heim >Java >javaLernprogramm >Wie gebe ich einen DataSnapshot-Wert einer Firebase-Echtzeitdatenbank von einer asynchronen Methode zurück?
DataSnapshot-Wert von einer Methode zurückgeben
Bei der Arbeit mit Firebase Realtime Database ist es üblich, Daten asynchron mithilfe der Methode addListenerForSingleValueEvent() abzurufen. Dies stellt jedoch eine Herausforderung dar, wenn versucht wird, den abgerufenen Wert als Ergebnis der aufrufenden Methode zurückzugeben.
Asynchrone Natur verstehen
Die asynchrone Natur der Firebase Realtime Database impliziert dass Daten möglicherweise nicht sofort nach dem Aufruf von addListenerForSingleValueEvent() verfügbar sind. Stattdessen wird die Methode onDataChange() aufgerufen, wenn die Daten geladen wurden.
Klassisches asynchrones Problem
private String getUserName(String uid) { databaseReference.child(String.format("users/%s/name", uid)) .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // How to return this value? dataSnapshot.getValue(String.class); } @Override public void onCancelled(DatabaseError databaseError) {} }); }
Im obigen Code die Methode getValue() wird aufgerufen, bevor die Methode onDataChange() aufgerufen wird. Dies führt dazu, dass ein Nullwert zurückgegeben wird, da die Daten noch nicht verfügbar sind.
Alternative Ansätze
Rückruf verwenden:
Erstellen Sie eine benutzerdefinierte Rückrufschnittstelle, um die Daten zu verarbeiten, sobald sie verfügbar sind.
public interface MyCallback { void onCallback(String value); } public void readData(MyCallback myCallback) { databaseReference.child(String.format("users/%s/name", uid)).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String value = dataSnapshot.getValue(String.class); myCallback.onCallback(value); } @Override public void onCancelled(DatabaseError databaseError) {} }); }
Im Übergeben Sie beim Aufruf der Methode eine Instanz der Rückrufschnittstelle, um die Daten zu empfangen.
readData(new MyCallback() { @Override public void onCallback(String value) { // Use the returned value here } });
Zukunft verwenden:
Verwenden Sie eine Zukunft, um das letztendliche Ergebnis der Asynchronität darzustellen Operation.
public Future<String> readData() { final Future<String> future = new CompletableFuture<>(); databaseReference.child(String.format("users/%s/name", uid)).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { future.complete(dataSnapshot.getValue(String.class)); } @Override public void onCancelled(DatabaseError databaseError) {} }); return future; }
Verwenden Sie in der aufrufenden Methode einen blockierenden Aufruf, um auf das Ergebnis zu warten, oder registrieren Sie einen Rückruf für eventuelle Ereignisse Abschluss.
Fazit
Das Zurückgeben eines DataSnapshot-Werts von einer Methode erfordert ein Verständnis der asynchronen Natur des Vorgangs. Durch die Verwendung von Callbacks oder Future können Entwickler den Rückgabewert verwalten, sobald er verfügbar ist, und so die Wartbarkeit und Korrektheit des Codes verbessern.
Das obige ist der detaillierte Inhalt vonWie gebe ich einen DataSnapshot-Wert einer Firebase-Echtzeitdatenbank von einer asynchronen Methode zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!