java - 如何将 Cloud Firestore 中的异步数据保存为变量?
问题描述
我开始在 Android 上使用 Firebase SDK 学习Cloud Firestore,我遇到了一个问题,我通过 OnCompleteListener 从 Firestore 数据库中检索数据,然后尝试将其保存为变量。问题是在 OnCompleteListener 结束并且我的 Android 应用程序继续执行下一行代码后,变量中的数据被重置并且没有保存。
我有一个用户集合,并且正在尝试为用户的赛季检索用户的运动:
db.collection("users").document(mAuth.getCurrentUser().getUid()).collection("seasons").document(seasonName)
.get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document != null && document.exists() && document.getData() != null) {
sport = String.valueOf(document.getData().get("sport"));
//sport is set to the value
}
}
}
});
//Now sport is null
运动设置为侦听器中的值,但在侦听器完成后变为 null。
所以我的问题是,我怎样才能永久保存变量以使其不会返回 null?有没有办法在没有监听器的情况下检索数据,所以我不会遇到这个问题,还是有其他解决方案?
提前致谢!
解决方案
该变量不会“返回”为空。问题是您添加的侦听器在查询完成后的一段未知时间内被调用。你不知道要花多长时间。因为时间是未知的,所以一个 Task 会被 立即返回get()
,并且你附加到它的回调会在一段时间后被调用。由于get()
立即返回,因此该变量sport
将保留其单独的 null 值,直到调用回调。这意味着您应该只使用回调中的结果。或者,如果您想将它存储在某个地方,只有在您确定回调已被调用时才访问它。
事实上,所有 Firebase API 都是异步的。 阅读本文以了解原因。您应该熟悉异步编程才能使用 Firebase SDK。
特别是对于 Android,您应该了解 Play Services Task API 的工作原理。
推荐阅读
- javascript - Redis connection is lost after multiple calls to function
- javascript - 将值从服务器返回到 html 以进行操作
- html - html input type="date" 在 chrome 上不能正常工作
- java - 需要帮助来存储来自 Java Web 应用程序的许多文档
- java - 无法构建 Spring maven 项目,POM.XMl 文件中的问题
- xcode - 如何使用 fastlane 重置特定 Xcode 版本的模拟器?
- elm - 匹配 Elm 记录类型的 `.foo` getter 的等效设置器
- jquery - 如果宽度为一定大小,jQuery会停止自定义函数的工作
- bash - 如何在 shell 中格式化日期
- locking - Gnome 库读/写锁实现