Android 中的嵌套 Firestore 异步侦听器
Nested Firestore asynchronous listeners in Android
所以我在几天集合中有活动文档,我需要将所有活动合并到一个列表中。我想我应该循环集合,然后循环活动,最后得到下面的代码,我不知道这是否是组合多个集合的最佳方式。更糟糕的是,我不知道我的列表何时准备好用于所有异步调用。
有什么建议吗?谢谢!
db.collection("calendar").get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot ds : task.getResult().getDocuments()) {
ds.getReference().collection("thingstodo").get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
for (DocumentSnapshot ds : task.getResult().getDocuments()) {
ScheduledItem item = ds.toObject(ScheduledItem.class);
itemsList.add(item);
}
}
});
}
}
});
get() method you're using on CollectionReference (which is a subclass of Query) returns a Task that becomes resolved when the document is ready. Instead of adding a listener to that individual Task, collect all the tasks into a List, and pass that to Tasks.whenAllComplete() 整组完成后响应。然后,您可以根据需要检查那里所有任务的结果。
设法按照@Doug 的建议编写代码。感谢题主!
这好多了:
db.collection("calendar").get()
.continueWith(new Continuation<Task<QuerySnapshot>, Task<?>>() {
@Override
public Task<?> then(@NonNull Task<Task<QuerySnapshot>> task) throws Exception {
List<Task<QuerySnapshot>> tasks = new ArrayList<Task<QuerySnapshot>>();
for (DocumentSnapshot ds : task.getResult().getResult())
tasks.add(ds.getReference().collection("thingstodo").get());
return Tasks.whenAllSuccess(tasks);
}
})
.addOnCompleteListener(new OnCompleteListener<Task<?>>() {
@Override
public void onComplete(@NonNull Task<Task<?>> task) {
List<QuerySnapshot> lists = (ArrayList<QuerySnapshot>)task.getResult().getResult();
for (QuerySnapshot qs : lists)
for (DocumentSnapshot ds: qs) {
ScheduledItem item = ds.toObject(ScheduledItem.class);
//add to list including day
itemsList.add(item);
}
//list ready to be used!
}
});
所以我在几天集合中有活动文档,我需要将所有活动合并到一个列表中。我想我应该循环集合,然后循环活动,最后得到下面的代码,我不知道这是否是组合多个集合的最佳方式。更糟糕的是,我不知道我的列表何时准备好用于所有异步调用。 有什么建议吗?谢谢!
db.collection("calendar").get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot ds : task.getResult().getDocuments()) {
ds.getReference().collection("thingstodo").get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
for (DocumentSnapshot ds : task.getResult().getDocuments()) {
ScheduledItem item = ds.toObject(ScheduledItem.class);
itemsList.add(item);
}
}
});
}
}
});
get() method you're using on CollectionReference (which is a subclass of Query) returns a Task that becomes resolved when the document is ready. Instead of adding a listener to that individual Task, collect all the tasks into a List, and pass that to Tasks.whenAllComplete() 整组完成后响应。然后,您可以根据需要检查那里所有任务的结果。
设法按照@Doug 的建议编写代码。感谢题主! 这好多了:
db.collection("calendar").get()
.continueWith(new Continuation<Task<QuerySnapshot>, Task<?>>() {
@Override
public Task<?> then(@NonNull Task<Task<QuerySnapshot>> task) throws Exception {
List<Task<QuerySnapshot>> tasks = new ArrayList<Task<QuerySnapshot>>();
for (DocumentSnapshot ds : task.getResult().getResult())
tasks.add(ds.getReference().collection("thingstodo").get());
return Tasks.whenAllSuccess(tasks);
}
})
.addOnCompleteListener(new OnCompleteListener<Task<?>>() {
@Override
public void onComplete(@NonNull Task<Task<?>> task) {
List<QuerySnapshot> lists = (ArrayList<QuerySnapshot>)task.getResult().getResult();
for (QuerySnapshot qs : lists)
for (DocumentSnapshot ds: qs) {
ScheduledItem item = ds.toObject(ScheduledItem.class);
//add to list including day
itemsList.add(item);
}
//list ready to be used!
}
});