java - 如何将 Cloud Firestore 中的异步数据保存为变量?

标签 java android firebase google-cloud-firestore

我开始学习Cloud Firestore在 Android 上使用 Firebase SDK 时,我遇到了一个问题:我通过 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?有没有一种方法可以在没有监听器的情况下检索数据,这样我就不会遇到这个问题,或者还有其他解决方案吗?

提前致谢!

最佳答案

该变量不会“返回”为 null。问题是您添加的监听器在查询完成后一段未知的时间内被调用。你不知道要花多长时间。由于时间未知,get() 会立即返回任务,并且您附加到它的回调将在一段时间后被调用。由于 get() 立即返回,因此变量 sport 将保留其单独的 null 值,直到调用回调为止。这意味着您应该只使用回调中的结果。或者,如果您想将其存储在某个地方,只有在确定回调已被调用时才访问它。

事实上,所有 Firebase API 都是异步的。 Read this了解原因。您应该熟悉异步编程才能使用 Firebase SDK。

特别对于 Android,you should learn how the Play Services Task API works .

关于java - 如何将 Cloud Firestore 中的异步数据保存为变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55943118/

相关文章:

java BlockingQueue 没有阻塞窥视?

java - 编译错误bouncycaSTLe java

android - kotlin 应用程序中的 DataBinding 出错

javascript - 无法从 .getDownloadURL() promise 中检索 Firebase downloadURL

Java 接口(interface) : Inheriting, 覆盖和重载方法

java - 在设置流道变量的值之前将流道的引用变量设置为knockOut的优点

android - 如何动态更新特定的overlayitem

android - 是否可以使用设备身份验证而不是创建自己的身份验证程序?

android - Flutter - 我无法使用 Google 帐户登录

java - Android Firebase REST 问题