首页 > 解决方案 > Android ComputableFuture 不适用于 Firestore

问题描述

我正在尝试在AndroidCompletableFutures中与Firestore一起使用。我已经设置了一个函数,如下所示: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 秒内没有响应

这通常表明您的设备目前没有健康的互联网连接。客户端将 > 在离线模式下运行,直到它能够成功连接到后端。

因此,我在没有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)。我将不胜感激任何关于为什么会这样的建议!

标签: javaandroidasynchronousgoogle-cloud-firestorecompletable-future

解决方案


由于某种原因,我切换到.getNow()而不是.get()并成功获得结果。不知道为什么,因为从文档看来,唯一的区别是.getNow()您可以提供默认结果。欢迎任何解释!


推荐阅读