【问题标题】:How to create callback functions for firebase queries [closed]如何为firebase查询创建回调函数[关闭]
【发布时间】:2018-02-13 11:25:49
【问题描述】:

我创建了一个使用 Firestore 查询来获取文档大小的函数,Firestore 查询工作正常,因为我在 android 的 LogCat 中获得了结果。这个函数的问题是它没有返回另一端文档的大小。

public String getDateFromFirestore(String UID, String animId){
        db.collection("users").document(UID).collection("animals").
        document(animalId).get().addOnCompleteListener(new 
        OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if(task.isSuccessful()){
                   size = task.getresults().getDocuments.size();
                }
              Log.w("Size:",String.valueOf(size));
            }
        });
   return String.valueOf(size);
}

要检索函数的结果,我使用以下代码:

String size = getDateFromFirestore(UID, animId);

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    数据从 Firestore(和大多数现代 Web API)异步加载。这样做是为了在加载数据时不会阻止您的应用程序,这会导致“应用程序无响应”对话框。

    查看这一点的最简单方法是使用一些放置良好的日志语句:

    System.out.println("Before starting get()");
    db.collection("users").document(UID).collection("animals").
    document(animalId).get().addOnCompleteListener(new 
    OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            System.out.println("In onComplete()");
        }
    });
    System.out.println("After starting get()");
    

    当你运行这段代码时,输​​出是:

    开始get()之前

    启动get()后

    在 onComplete() 中

    这可能不是您所期望的。但它完美地解释了您返回错误值的原因:return 语句运行时您的数据尚未加载。

    现在您不能返回仍在异步加载的数据。我的典型解决方案是将问题从“首先获取尺寸,然后使用尺寸进行 xyz”重新构建为“开始获取尺寸。一旦我们有了尺寸,就使用它进行 xyz”。在代码中,这意味着您将需要大小的代码移动到 onComplete() 方法中,类似于您的 Log.w() 已经存在的位置。

    有关更多信息,请参阅:

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多