java - Android ComputableFuture 无法与 Firestore 配合使用

标签 java android asynchronous google-cloud-firestore completable-future

我正在尝试在 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() 您可以提供默认结果。欢迎任何解释!

关于java - Android ComputableFuture 无法与 Firestore 配合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60563342/

相关文章:

java - 如何在 Linux/Debian 上将目录包含到 java.library.path?

Android:从 API 级别 10 的 ContactsProvider 检索图像或缩略图

javascript - 在继续之前等待异步函数的响应?

android - 为什么我的 TextView 在 ImageView 下没有显示

javascript - 等待 JS 函数中的异步调用结束。 (jQuery.延迟?)

javascript - jQuery 是如何完成它的异步动画的?

java - google face API 对所有图像的处理速度很慢?

java - 当找不到 Maven->Update Project/MANIFEST.MF 文件时停止 Eclipse 重置根上下文

java - App Engine 上的 Google Guava 缓存

android - 下载phonegap中的资源包