java - Firestore - 使用 CountDownLatch 等待任务完成 - 挂起应用程序

标签 java android firebase google-cloud-firestore countdownlatch

我对 CountDownLatch 有一个大问题。我正在开发使用 Firestore 作为数据库的应用程序。我已经创建了一个用于管理数据库的文件,并且我想等待 writeSomethingToDb() 函数完成。我发现这个例子如何使用 CountDownLatch https://www.javaquery.com/2016/09/how-to-save-data-in-firebase.html ,它是实时数据库,但我猜它具有类似的功能。我编写了代码,尝试通过此函数保存某些内容,但应用程序只是挂起。 看起来它永远不会进入OnComplete,但是如果没有CountDownLatch,数据就会正确添加到数据库中。

public void addSomethingToDb(FirestoreCollections collections, Object data) {
    CountDownLatch countDownLatch = new CountDownLatch(1);
     db.collection(collections.getName()).add(data).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
         @Override
         public void onComplete(@NonNull Task<DocumentReference> task) {
             if(task.isSuccessful()){
                 Toast.makeText(context, String.valueOf(countDownLatch.getCount()), Toast.LENGTH_SHORT).show();
                 countDownLatch.countDown();
                 Toast.makeText(context, String.valueOf(countDownLatch.getCount()), Toast.LENGTH_SHORT).show();

             }else{
                 Toast.makeText(context, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
             }
         }
     });
     try{
         countDownLatch.await();
     } catch (InterruptedException e) {
         e.printStackTrace();
     }

}

最佳答案

基本上,您尝试使用异步 API 将数据同步添加到数据库。这不是一个好主意,因为您的线程最终会被阻塞。因此,您应该按预期异步处理 API。正如我的评论中所述,为了解决这个问题,我建议您查看我的答案 post 为了更好地理解,您还可以看看这个 video .

关于java - Firestore - 使用 CountDownLatch 等待任务完成 - 挂起应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51487191/

相关文章:

java - 从字符串数组中获取特定部分

java - 将 PDF 文件附加到来自应用程序的电子邮件

java - 谷歌云消息或 XMPP

android - 如何在android中修复对话框的大小

javascript - 错误: Failed to get Firebase project build. 请确保该项目存在并且您的帐户有权限访问它

java - AEM/Sling - 如何在独立代码中创建 ResourceResolverFactory?

java - 手工制作的pdf文件

java - 如何在 Cloud Firestore 中正确构建本地化内容?

firebase - RNFirebase v6 推送通知不会同时出现在 iOS 和 Android 上

java - Java动态生成按钮