У меня есть Карта ссылок, которую я прочитал в Firestore.эти ссылки приводят меня к документам, которые я готов использовать их данные для создания экземпляра моего класса «Контакт».
Для этого я создал список задач, каждая из которых использует свою ссылку для чтения из Firestore и извлечения необходимых данных.
Как только все это сделано, я использую Задачи.whenAll (задачи) .addOnSuccessListener (), желающий получить мой новый массив контактов.
В этом методе «контакты» пустые, а «данные» полны ссылок на документы.Я ожидал, что Tasks.whenAll(tasks)
будет вызываться только тогда, когда все чтение с использованием ссылок завершено, однако вызывается немедленно, поэтому - ничего не происходит.
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 вызывался, как только еговсе закончено и не сразу.Я хотел бы получить надлежащее объяснение этой проблемы и достойный код, который должен выполнять эту работу вместо моей.
Я действительно ценю вашу помощь!