Chcę zbudować metodę zwracającą wartość child
w FireBase
. Starałem się zrobić coś takiego:Poczekaj, aż baza danych uzyska dane
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;
}
Problem polega na tym, że metoda zwraca null
To prawdopodobnie dlatego, że metoda nie czekać, aż zakończy się słuchaczem i powrócić null
ponieważ jej wartość domyślną message
. W jaki sposób sprawić, aby ta metoda była oczekiwana, dopóki słuchacz nie pojawi się , a następnie zwróci wartość.
Zakładamy, że root jest przechowywany w klasie (a klasa nie jest w gc), nie powinno to mieć znaczenia, że funkcja się zakończy –
Nie można synchronicznie zwrócić wartości asynchronicznej. Zmienna "message" jest tutaj zupełnie bezsensowna, ponieważ nie będzie ustawiona w momencie, kiedy ją zwróci - dane muszą być najpierw pobrane z serwera. Zamiast tego funkcja getMessage() powinna albo zaakceptować wywołanie zwrotne, albo wywołać zdarzenie. Istnieje [przewodnik poświęcony tym pojęciom] (https://www.firebase.com/docs/android/), pełen przykładów i porad. – Kato
[Użyj tej odpowiedzi] (http://stackoverflow.com/a/38542796/4882204). Mam do czynienia z tym samym problemem i rozwiązany przy użyciu EventBus. –