我有一份从Firestore中读取的参考地图。这些引用使我找到了一些文档,我愿意使用它们的数据来创建类“ Contact”的实例。
为此,我创建了一个任务列表,该任务的每个任务都使用其引用从Firestore中读取并检索所需的数据。
一旦全部完成,我将使用Tasks.whenAll(tasks).addOnSuccessListener()来检索我的新联系人列表。
在此方法中,“联系人”为空,而“数据”中充满了文档引用。
我希望Tasks.whenAll(tasks)
仅在使用refs进行的所有读取完成后才被调用,但是它会立即被调用,因此-没有任何反应。
private void createContactArray(final ArrayList<Contact> contacts, final Map<String, DocumentReference> data) {
List<Task<DocumentSnapshot>> tasks = new ArrayList<>();
for (final Map.Entry<String, DocumentReference> entry : data.entrySet()) {
tasks.add(db.document(entry.getValue().getPath()).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Map<String,String> contactDetails = (Map<String, String>) document.getData().get(entry.getKey());
Contact contact = createContact(contactDetails);
if(contact != null){ contacts.add(contact);}
} else {
Log.d(ACTION_FETCH_CONTACT_LIST,"There was ref problem with " + entry.getKey());
}
}else {
Log.d(ACTION_FETCH_CONTACT_LIST, "get failed with ", task.getException());
}
}
}));
}
Tasks.whenAll(tasks).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
sendBroadcastActionContactList(contacts);
}
});
我希望Tasks.whenAll一旦完成就立即调用,而不是立即调用。我希望对此问题有一个适当的解释,并有一个体面的代码来代替我的工作。
非常感谢您的帮助!
答案 0 :(得分:1)
您使用的API错误。您应该将get()
返回的任务收集到一个数组中,而不是立即向每个回调中添加一个回调。将该任务列表传递给Tasks.whenAll()。然后,在Tasks.whenAll返回的任务的回调中,您可以检查每个DocumentSnapshot结果。