【发布时间】:2020-03-06 11:39:05
【问题描述】:
我正在尝试在 Android 中将 CompletableFutures 与 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 调用无法通过(因此无法连接到火库)。我将不胜感激任何关于为什么会这样的建议!
【问题讨论】:
标签: java android asynchronous google-cloud-firestore completable-future