내 firebase valueEventListener를 기다리는 데 세마포어를 사용하려고합니다. 사용자가 작성해야하는 6 가지 필드가있는 사용자 정보 활동이 있습니다. 사용자가 정보를 저장하면 "모두 또는 아무것도 없음"유형의 검사를 수행하려고합니다. 특정 사용자 정보 (예 : 사용자 이름, 전자 메일 및 전화 번호)는 복제 할 수 없습니다. 나는 중포 기지를 사용하고 현재 일반 아이디어는 형식이다 :Android : firebase 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;
}
}
는 지금 세마포어가 해제되지 ... 궁금 : 여기에 내 현재의 방법이다. semaphore가 없으면 firebase 쿼리가 완료되기 전에 return 문이 실행됩니다.
참조 http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener : 이것은 하나의 작업에서 threated 할 수 있기 때문에, 당신은
Continuation
작업을 만들 수 있습니다 –