Android ComputableFuture не работает с Firestore - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь использовать 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). Буду признателен за любые советы о том, почему это так!

1 Ответ

0 голосов
/ 06 марта 2020

Почему-то я переключился на .getNow() вместо .get(), и результат получился успешно. Не уверен почему, потому что из документов похоже, что единственное отличие было с .getNow(), вы могли бы предоставить результат по умолчанию. Любое объяснение приветствуется!

...