【问题标题】:Java Firebase: No Exception when failed to authenticateJava Firebase:身份验证失败时没有异常
【发布时间】: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


【解决方案1】:

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

while(!done.get());

您尚未从数据库中获取数据。所以要解决这个问题,您需要更改代码的逻辑并使用callback。这意味着您需要等待数据,然后才能使用该语句。这是异步 API 的一个经典问题,为此我建议您阅读我在 post 中的回答。 onDataChange() 方法的调用方式相同。另请参阅我回答的最后一部分,其中我解释了如何从外部获取数据。

【讨论】:

  • 我已经改成apiFuture.get()
  • 然后呢?发生了什么?
  • 同样的结果
  • 好的,但我没有建议你使用apiFuture.get() 我建议你使用我在post 中的回答。你试过了吗?
  • 用你的答案测试。如果不使用 apiFuture.get(),则不会触发 Listener,因为守护线程将被杀死。
猜你喜欢
  • 2016-09-12
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2018-02-24
  • 2017-08-24
相关资源
最近更新 更多