gpt4 book ai didi

Android:WAITING firebase valueEventListener

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:51:59 25 4
gpt4 key购买 nike

我正在尝试使用信号量来等待我的 firebase valueEventListener。我有一个用户信息 Activity ,其中包含用户必须填写的 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 查询完成之前触发...

最佳答案

如前所述,您可以使用 Firebase Task API发表于 Google I/O 2016 .

Task<?>[] tasks = new Task[] {
saveUserName(username),
saveFriends(friends),
saveOtherStuff(stuff)
};

Tasks.whenAll(tasks)
.continueWithTask(new RollbackIfFailure())
.addOnCompleteListener(this)
.addOnFailureListener(this);

如果进行修改的每个步骤都可以并行运行,您可以创建一个返回 Task 的方法。对于其中的每一个,如下所示:

public Task<String> saveUserName(final String username) {
final TaskCompletionSource<String> tcs = new TaskCompletionSource<>();

mDatabase.child("users")
.child(username)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String username = dataSnapshot.getValue(String.class);
if (null == username) {
tcs.setResult(null);
} else {
tcs.setException(new IllegalStateException(username));
}
}

@Override
public void onCancelled(FirebaseError firebaseError) {
tcs.setException(new IOException(TAG, firebaseError.toException()));
}
});

return tcs.getTask();
}

如果其中任何一个失败,您需要回滚操作。由于这可能会受到单个任务的威胁,因此您可以创建一个 Continuation任务:

class RollbackIfFailure implements Continuation<Void, Task<Void>> {
@Override
public Task<Void> then(@NonNull Task<Void> task) throws Exception {

final TaskCompletionSource<Void> tcs = new TaskCompletionSource<>();

if (task.isSuccessful()) {
tcs.setResult(null);
} else {
// Rollback everything
}

return tcs.getTask();
}
}

关于Android:WAITING firebase valueEventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38966056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com