Java Firebase:无法进行身份验证时无异常

时间:2018-01-28 10:08:11

标签: java firebase firebase-realtime-database firebase-admin

由于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();

1 个答案:

答案 0 :(得分:0)

这不是如何更改done AtomicBoolean变量的值。使用您的代码始终为false因为onComplete()方法被称为asynchronous,这意味着当您使用这行代码时:

while(!done.get());

您还没有从数据库中获取数据。因此,要解决此问题,您需要更改代码的逻辑并使用{​​{1}}。这意味着您需要等待数据,然后才能使用该语句。这是异步API的一个经典问题,为此,我重新尝试从这个post读取我的答案。 callback方法以相同的方式调用。请参阅我的答案的最后一部分,其中我已经解释了如何在外面获取数据。