Heim >Java >javaLernprogramm >Wie gebe ich einen DataSnapshot-Wert einer Firebase-Echtzeitdatenbank von einer asynchronen Methode zurück?

Wie gebe ich einen DataSnapshot-Wert einer Firebase-Echtzeitdatenbank von einer asynchronen Methode zurück?

Susan Sarandon
Susan SarandonOriginal
2025-01-03 09:43:40550Durchsuche

How to Return a Firebase Realtime Database DataSnapshot Value from an Asynchronous Method?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn