由于Firebase SDK在后台创建恶魔线程以同步数据。我使用建议的解决方案作为链接创建一个AtomicBoolean,等待任务完成。
java Firebase: delay exit until writes finish
我尝试删除网络管理控制台中的密钥。如果没有任何超时异常,任务就永远不会完成。
public static void main(String[] args) throws IOException {
InputStream serviceAccount = Appl.class.getClassLoader().getResourceAsStream("testing-fcf995d2ab6f.json");
FirebaseOptions.Builder builder = new FirebaseOptions.Builder();
builder.setCredentials(GoogleCredentials.fromStream(serviceAccount));
builder.setDatabaseUrl("https://golden-attic-93815.firebaseio.com/");
FirebaseOptions firebaseOptions = builder.build();
FirebaseApp.initializeApp(firebaseOptions);
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference ref = firebaseDatabase.getReference("techoffice/database/example");
DatabaseReference usersRef = ref.child("users");
final AtomicBoolean done = new AtomicBoolean(false);
Map<String, User> users = new HashMap<String, User>();
users.put("testerA", new User("Tester A"));
users.put("testerB", new User("Tester B"));
usersRef.setValue(users, new DatabaseReference.CompletionListener(){
public void onComplete(DatabaseError error, DatabaseReference ref) {
if (error != null){
System.err.println("Error " + error.getMessage());
}else {
System.out.println("Completed");
}
done.set(true);
}
});
while(!done.get());
}
如果我更改为setValueAsync,我会得到相同的结果。
ApiFuture<Void> apiFuture = usersRef.setValueAsync(users);
apiFuture.get();
答案 0 :(得分:0)
这不是如何更改done
AtomicBoolean变量的值。使用您的代码始终为false
因为onComplete()
方法被称为asynchronous
,这意味着当您使用这行代码时:
while(!done.get());
您还没有从数据库中获取数据。因此,要解决此问题,您需要更改代码的逻辑并使用{{1}}。这意味着您需要等待数据,然后才能使用该语句。这是异步API的一个经典问题,为此,我重新尝试从这个post读取我的答案。 callback
方法以相同的方式调用。请参阅我的答案的最后一部分,其中我已经解释了如何在外面获取数据。