Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Firestore:如何从外部void onComplete方法读取数据_Java_Android_Firebase_Google Cloud Firestore - Fatal编程技术网

Java Firestore:如何从外部void onComplete方法读取数据

Java Firestore:如何从外部void onComplete方法读取数据,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我从Cloud Firestore读取数据: firestoreDB.collection("events") .whereEqualTo("type", eventType) .get() .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override

我从Cloud Firestore读取数据:

      firestoreDB.collection("events")
                .whereEqualTo("type", eventType)
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                           List<Event> eventList = new ArrayList<>();

                           for(DocumentSnapshot doc : task.getResult()){
                              Event e = doc.toObject(Event.class);
                              e.setId(doc.getId());
                               eventList.add(e);
                           }
               //do something with list of pojos retrieved

                        } else {
                            Log.d(TAG, "Error getting documents: ", task.getException());
                        }
                    }
 }); 
firestoreDB.collection(“事件”)
.whereEqualTo(“类型”,事件类型)
.get()
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
List eventList=new ArrayList();
对于(DocumentSnapshot文档:task.getResult()){
事件e=doc.toObject(Event.class);
e、 setId(doc.getId());
事件列表。添加(e);
}
//对检索到的POJO列表执行某些操作
}否则{
Log.d(标记“获取文档时出错:”,task.getException());
}
}
}); 
由于onComplete是一个void方法,如何从外部方法获取eventList

例如,我尝试:

List<Event> ReadCollection()
{
   final List<Event> eventList = new ArrayList<>();
firestoreDB.collection("events")
                    .whereEqualTo("type", eventType)
                    .get()
                    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> task) {
                            if (task.isSuccessful()) {
                               List<Event> eventList = new ArrayList<>();

                               for(DocumentSnapshot doc : task.getResult()){
                                  Event e = doc.toObject(Event.class);
                                  e.setId(doc.getId());
                                   eventList.add(e);
                               }
                   //do something with list of pojos retrieved

                            } else {
                                Log.d(TAG, "Error getting documents: ", task.getException());
                            }
                        }
     }); 

return eventList;
}
List ReadCollection()
{
最终列表eventList=新的ArrayList();
firestoreDB.集合(“事件”)
.whereEqualTo(“类型”,事件类型)
.get()
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
List eventList=new ArrayList();
对于(DocumentSnapshot文档:task.getResult()){
事件e=doc.toObject(Event.class);
e、 setId(doc.getId());
事件列表。添加(e);
}
//对检索到的POJO列表执行某些操作
}否则{
Log.d(标记“获取文档时出错:”,task.getException());
}
}
}); 
返回事件列表;
}

因为onComplete是一个void方法,所以它不起作用。我无法从Cloud Firestore中读取任何内容。

您现在无法返回尚未加载的内容。
onComplete()
方法具有异步行为,这意味着即使在尝试将类型为
Event
的对象添加到
eventList
ArrayList之前,也会调用该方法。这就是为什么您的列表在该方法之外总是空的。换句话说,当您返回
事件列表时,数据尚未从数据库加载完毕,因此要解决这个问题,您需要创建自己的回调以等待数据。因此,首先需要创建如下界面:

public interface MyCallback {
    void onCallback(List<Event> eventList);
}
public void readData(MyCallback myCallback) {
    firestoreDB.collection("events")
        .whereEqualTo("type", eventType)
        .get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    List<Event> eventList = new ArrayList<>();

                    for(DocumentSnapshot doc : task.getResult()) {
                        Event e = doc.toObject(Event.class);
                        e.setId(doc.getId());
                        eventList.add(e);
                    }
                    myCallback.onCallback(eventList);
                } else {
                    Log.d(TAG, "Error getting documents: ", task.getException());
            }
        }

     });
}
readData(new MyCallback() {
    @Override
    public void onCallback(List<Event> eventList) {
        Log.d("TAG", eventList.toString);
    }
});

这是使用
eventList
外部
onComplete()
方法的唯一方法。要了解更多信息,您还可以查看此

回复Alex Mamo:太好了,非常感谢。我是Android和Cloud Firestore的新手。这是我见过的最专业的答案。谢谢你的欣赏@米克林