Я пытаюсь использовать Семафор, чтобы дождаться моего значения firebaseEventListener. У меня есть информация о пользователе с 6 различными полями, которые пользователь должен заполнить. Когда пользователь сохраняет свою информацию, я хочу сделать «все или ничего». Некоторая информация пользователя не может быть дублирована ... например, имя пользователя, адрес электронной почты и номер телефона. Я использую firebase и в настоящее время общая идея имеет формат:Android: wait forbainbase valueEventListener
void saveUserInfo(){
if(field1 exist in database){
return;
}
.
.
.
if(field6 exist in database){
return;
}
savefield1();
.
.
.
savefield6();
}
Проблема, которую я имею в методе, который проверяет, является ли или нет, существует ли значение в базе данных. Вот мой текущий метод:
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;
}
}
Сейчас семафор не отпуская ... Было интересно, если кто-нибудь может помочь мне здесь. Без семафора оператор возврата будет срабатывать до того, как запрос firebase может завершиться ...
См http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –