Я пытаюсь использовать CompletableFutures
с Firestore в Android. Я настроил функцию, используя CompletableFutures
, как показано ниже:
CompletableFuture<List<Park>> loadAllParks(){
final CompletableFuture<List<Park>> future = new CompletableFuture<>();
db.collection("parks")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<Park> results = new ArrayList<>();
for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
Log.d("SUCCESS", document.getId() + " => " + document.getData());
Park documentObj = document.toObject(Park.class);
results.add(documentObj);
}
future.complete(results);
} else {
Log.d("ERROR", "Error getting documents: ", task.getException());
future.completeExceptionally(new CustomExceptions("Firebase Error"));
}
}
});
return future;
}
, и эта функция вызывается следующим образом:
try {
allParks = loadAllParks().get();
for (Park park: allParks) {
Log.d("DEBUG", park.getName());
}
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "An error has occurred while retrieving the parks.",
Toast.LENGTH_SHORT).show();
}
Однако это приводит к ошибке :
W / Firestore: (21.4.1) [OnlineStateTracker]: Не удалось связаться с бэкэндом Cloud Firestore. Сервер не ответил в течение 10 секунд
Обычно это указывает на то, что в данный момент ваше устройство не имеет исправного соединения Inte rnet. Клиент будет> работать в автономном режиме до тех пор, пока не сможет успешно подключиться к бэкэнду.
Таким образом, вместо этого я опробовал его без функций CompletableFuture
в следующем манере, и был смог получить желаемый результат с помощью следующего кода:
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("parks")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<Park> results = new ArrayList<>();
for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
Log.d("SUCCESS", document.getId() + " => " + document.getData());
Park documentObj = document.toObject(Park.class);
results.add(documentObj);
}
for (Park park: results) {
Log.d("DEBUG", park.getName());
}
} else {
Log.d("ERROR", "Error getting documents: ", task.getException());
}
}
});
Таким образом, для меня совершенно очевидно, что по какой-то причине CompletableFuture
не завершен, и это как-то вызывает Firestore вызов, чтобы не дозвониться (и, следовательно, не может подключиться к Firestore). Буду признателен за любые советы о том, почему это так!