Android ComputableFuture 不适用于 Firestore

Android ComputableFuture doesn't work with Firestore

我正在尝试在 Android 中将 CompletableFuturesFirestore 一起使用。我已经使用 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]: Could not reach Cloud Firestore backend. Backend didn't respond within 10 seconds

This typically indicates that your device does not have a healthy Internet connection at the moment. The client will > operate in offline mode until it is able to successfully connect to the backend.

因此,我在没有 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)。对于为什么会出现这种情况,我将不胜感激!

因为某些原因,我改成.getNow()而不是.get(),结果成功获取。不知道为什么,因为从 docs 看来唯一的区别是 .getNow() 您可以提供默认结果。欢迎任何解释!