如何为firebase查询创建回调函数

时间:2018-02-13 11:25:49

标签: java android firebase google-cloud-firestore

我已经使用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);

1 个答案:

答案 0 :(得分:0)

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

最简单的方法是使用一些放置好的日志语句:

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语句运行时,您的数据尚未加载。

您无法返回仍在异步加载的 now 数据。我的典型解决方案是重新设置问题,然后首先获取大小,然后使用大小&#34;到&#34;开始获得大小。一旦我们有了这个尺寸,就用它做xyz&#34;。在代码中,这意味着您将需要大小的代码移动到onComplete()方法中,类似于Log.w()已经存在的位置。

有关详情,请参阅: