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

时间:2018-07-23 21:01:09

标签: 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();
     }

}

1 个答案:

答案 0 :(得分:0)

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