【发布时间】:2018-07-07 04:46:51
【问题描述】:
由于 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();
【问题讨论】:
-
你怎么知道“任务永远不会完成”,在你的主函数末尾添加这一行
System.out.println("Task Completed");,你现在得到什么 -
如果我添加“System.out.println("Task Completed");”,任务也不会停止。因为“while(!done.get());”总是返回 false。
-
我认为你可以使用返回 ApiFuture 的
usersRef.setValueAsync(users)方法,如果你想等待写操作,你可以检查ApiFuture.isDone()。 -
我得到相同的结果。对于 ApiFuture
apiFuture = usersRef.setValueAsync(users); apiFuture.get();
标签: java firebase firebase-realtime-database firebase-admin