Ich möchte eine Methode erstellen, die einen child
Wert in FireBase
zurückgibt. Ich habe versucht, so etwas zu tun:warten, bis firebase Daten abruft
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
, die wahrscheinlich ist, dass das Verfahren, bis die Zuhörer beendet wartet nicht, und das Rück null
weil sein Standardwert von message
. Wie kann ich diese Methode warten, bis der Listener auftritt und dann den Wert zurückgeben.
davon ausgehen, dass der Stamm in der Klasse gespeichert ist (und die Klasse nicht gc'ed ist), sollte es keine Rolle spielen, dass die Funktion beendet wird –
Sie können keinen asynchronen Wert synchron zurückgeben. Die "message" -Variable ist hier völlig sinnlos, da sie zum Zeitpunkt der Rückgabe nicht gesetzt wird - die Daten müssen zuerst vom Server geholt werden. Stattdessen sollte getMessage() entweder einen Callback irgendeiner Art akzeptieren oder ein Event auslösen. Es gibt [eine Anleitung zu diesen Konzepten] (https://www.firebase.com/docs/android/), voller Beispiele und Ratschläge. – Kato
[Diese Antwort verwenden] (http://stackoverflow.com/a/38542796/4882204). Ich habe das gleiche Problem gesehen und mit EventBus gelöst. –