我正在使用Firebase处理Java(不是Android)的图形程序,我正在尝试查看某个字符串的一个数据库的值,当我找到它时,从第一个数据库中获取数据并将其写入另一个数据库。
我能够正确读取和写入数据,但由于两个特定的问题,我遇到了让程序终止的问题。
如果我不以某种方式“等待”完成侦听器(在本例中为CountDownLatch),程序会在完成侦听器的onComplete()方法触发之前终止,并且值为从未写入数据库。
如果我使用CountDownLatch等待onComplete()方法触发,程序永远不会终止,因为显然完成侦听器永远不会触发。
当我使用CountDownLatch时,会写入数据,但完成侦听器永远不会触发,程序也不会终止。
以下是我这样做的方法:
public static void addUser() {
final String email = Tools.getEmail();
DatabaseReference grayRef = FirebaseDatabase.getInstance().getReference().child("graylist");
// Search the graylist for the email specified.
CountDownLatch dataChange = new CountDownLatch(1); // need this so Parse-Ly doesn't close before event fires
grayRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onCancelled(DatabaseError dbe) {}
@Override
public void onDataChange(DataSnapshot snap) {
Iterable<DataSnapshot> graylist = snap.getChildren();
for(DataSnapshot gray : graylist) {
String uid = gray.getKey();
String em = gray.getValue(String.class);
if(em.equals(email)) {
// We found the one we're looking for. Insert its UID into the whitelist.
final CountDownLatch completion = new CountDownLatch(1);
DatabaseReference whiteRef = FirebaseDatabase.getInstance().getReference().child("whitelist");
whiteRef.child(uid).setValue(email, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError dbe, DatabaseReference dbr) {
completion.countDown();
if(dbe != null) {
System.err.println("Error adding user to whitelist!");
dbe.toException().printStackTrace();
}
}
});
try {
completion.await();
System.out.println("User added successfully!");
} catch(InterruptedException ie) {
System.err.println("ERROR: Completion latch interrupted!");
ie.printStackTrace();
}
break;
}
}
dataChange.countDown();
}
});
try {
dataChange.await(); // wait for event to fire before we move on
} catch(InterruptedException ie) {
System.err.println("ERROR: Data change latch interrupted!");
ie.printStackTrace();
}
}
“完成”CountDownLatch是我用来等待触发onComplete()方法的那个。
有没有人知道为什么尽管数据被写入并出现在数据库中,完成侦听器永远不会触发?