【发布时间】:2016-12-22 07:21:33
【问题描述】:
我正在尝试使用 Semaphore 来等待我的 firebase valueEventListener。我有一个用户信息活动,其中包含用户必须填写的 6 个不同字段。当用户保存他/她的信息时,我想做一个“全有或全无”类型的检查。某些用户信息不能重复...例如用户名、电子邮件和电话号码。我正在使用 firebase,目前的总体思路是:
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;
}
}
现在信号量没有释放...想知道是否有人可以在这里帮助我。如果没有信号量,return 语句将在 firebase 查询完成之前触发...
【问题讨论】:
标签: android asynchronous firebase firebase-realtime-database semaphore