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

问题描述 投票:0回答:1

我开始在Android上使用Firebase SDK学习Cloud Firestore,我遇到了一个问题,我通过OnCompleteListener从Firestore数据库中检索数据,然后尝试将其保存为变量。问题是在OnCompleteListener结束并且我的Android App移动到下一行代码之后,变量中的数据将被重置而不会保存。

我有一组用户,我正在尝试为用户的季节检索用户的运动:

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?有没有办法在没有监听器的情况下检索数据,所以我不会遇到这个问题,还是有其他解决方案?

提前致谢!

java android firebase google-cloud-firestore
1个回答
1
投票

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

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

对于Android专门,you should learn how the Play Services Task API works

© www.soinside.com 2019 - 2024. All rights reserved.