Ich versuche Semaphore zu verwenden, um auf meine firebase valueEventListener zu warten. Ich habe eine Benutzer-Info-Aktivität mit 6 verschiedenen Feldern, die der Benutzer ausfüllen muss. Wenn der Benutzer seine Informationen speichert, möchte ich eine Art "alles oder nichts" prüfen. Bestimmte Benutzerinformationen können nicht dupliziert werden ... z. B. Benutzername, E-Mail-Adresse und Telefonnummer. Ich bin mit Feuerbasis und zur Zeit die allgemeine Idee ist das Format:Android: Warten auf Firebase valueEventListener
void saveUserInfo(){
if(field1 exist in database){
return;
}
.
.
.
if(field6 exist in database){
return;
}
savefield1();
.
.
.
savefield6();
}
Das Problem, das ich in dem Verfahren habe, ob oder nicht überprüft existiert der Wert bereits in der Datenbank. Hier ist meine aktuelle Methode:
public boolean alreadyInUse(String key, String value) throws InterruptedException {
final StringBuilder done = new StringBuilder("");
final Semaphore semaphore = new Semaphore(0);
mDatabase.child(key).child(value).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String result = dataSnapshot.getValue(String.class);
if(result == null){
Log.d("WorkoutLog", "result: null");
done.append("false");
semaphore.release();
return;
}
else if(result.equals(uID)){
Log.d("WorkoutLog", "result: " + result.toString());
done.append("false");
semaphore.release();
return;
}
else{
Log.d("WorkoutLog", "result: " + result.toString());
done.append("true");
semaphore.release();
return;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
semaphore.acquire();
if(done.equals("true")){
return true;
}
else if(done.equals("false")){
return false;
}
else{
Log.d("WorkoutLog", "Shouldn't be here");
return true;
}
}
Im Moment ist die Semaphore nicht frei ... Frage mich, ob jemand kann mir helfen hier. Ohne Semaphor wird die return-Anweisung ausgelöst, bevor die Firebase-Abfrage abgeschlossen werden kann.
Siehe http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –