java - 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)。我将不胜感激任何关于为什么会这样的建议!
解决方案
由于某种原因,我切换到.getNow()
而不是.get()
并成功获得结果。不知道为什么,因为从文档看来,唯一的区别是.getNow()
您可以提供默认结果。欢迎任何解释!
推荐阅读
- python-3.x - 守护实现 Paho 的 Python 脚本
- ssh - 无法更改 Google Coral 开发板上的 sshd_config
- r - 在 R xgboost 包上拟合模型后,如何释放 GPU 内存?
- delphi - 为什么 TPanel.Canvas.Font 属性(通过受保护的黑客访问)与 TPanel.Font 属性不同?
- javascript - 如何访问/删除 Firestore 中随机创建的文档 ID?
- azure - 无法在 AKS 节点上激活 HugePage
- visual-studio-2019 - SSRS 将总行数从主报表传递到子报表
- python - K-最近邻模型不工作。不再支持将列表喜欢传递给带有任何缺失标签的 .loc 或 []
- javascript - Android版本检查弹窗
- python - discord.py:有什么东西可以使它在踢/禁止命令不起作用的地方吗?