Android ComputableFuture 不适用于 Firestore
Android ComputableFuture doesn't work with Firestore
我正在尝试在 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]: 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()
您可以提供默认结果。欢迎任何解释!
我正在尝试在 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]: 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()
您可以提供默认结果。欢迎任何解释!