我从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());
}
}
});
由于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;
}
它不起作用,因为onComplete是一个void方法。我无法从Cloud Firestore中读到任何内容。
答案 0 :(得分:1)
您现在无法返回尚未加载的内容。 onComplete()
方法具有异步行为,这意味着甚至在您尝试将Event
类型的对象添加到eventList
ArrayList之前就会调用该行为。这就是为什么你的列表在该方法之外总是空的。换句话说,当您返回eventList
时,数据尚未从数据库中完成加载,因此要解决此问题,您需要创建自己的回调以等待数据。首先,您需要创建一个这样的界面:
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()
方法并将MyCallback
接口的实例作为参数传递给任何需要的地方,如下所示:
readData(new MyCallback() {
@Override
public void onCallback(List<Event> eventList) {
Log.d("TAG", eventList.toString);
}
});
这是您可以使用eventList
外部onComplete()
方法的唯一方法。有关更多信息,您还可以查看此 video 。