【问题标题】:Android ComputableFuture doesn't work with FirestoreAndroid ComputableFuture 不适用于 Firestore
【发布时间】:2020-03-06 11:39:05
【问题描述】:

我正在尝试在 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]:无法访问 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 调用无法通过(因此无法连接到火库)。我将不胜感激任何关于为什么会这样的建议!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 2020-09-27
      • 2021-08-16
      • 2018-04-02
      • 1970-01-01
      • 2021-10-06
      • 2020-03-14
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多