Java 在Firestore中阅读时出现Android封装错误

Java 在Firestore中阅读时出现Android封装错误,java,android,firebase,google-cloud-firestore,android-viewmodel,Java,Android,Firebase,Google Cloud Firestore,Android Viewmodel,我在我的ViewModel中设置了一个getter方法,以获得一个名为cWeek的长类型字段。当我在addSnapshotListener中使用value.getLong时,它工作并从db返回值,但当我尝试返回它时,变量为null。我真的不知道该找什么来解决这个问题 Getter // this var is initialized in global scope Long cWeek = getCWeek(); public Long getCWeek() { new Ref

我在我的
ViewModel
中设置了一个getter方法,以获得一个名为
cWeek
的长类型字段。当我在
addSnapshotListener
中使用
value.getLong
时,它工作并从db返回值,但当我尝试返回它时,变量为null。我真的不知道该找什么来解决这个问题

Getter

// this var is initialized in global scope
Long cWeek = getCWeek();

public Long getCWeek() {
        new References()
                .getUserRefDoc()
                .addSnapshotListener(new EventListener<DocumentSnapshot>() {
                    @Override
                    public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException e) {
                        if (e != null) {
                            Log.d(TAG, "Could not get cWeek data " + e);
                        }
                        Long var = (Long) value.get("cWeek");

                        cWeek = var;
                        Log.d(TAG, "cWeek: " + cWeek);
                    }
                });
        Log.d(TAG, "cWeek AFTER: " + cWeek);
        return cWeek;
    }

addSnapshotListener
是异步的,在查询完成之前立即返回。稍后将调用您提供的回调。同时,您的代码将继续执行,并在查询仍在进行时返回cWeek的初始值


如果您希望从ViewModel提供Firestore查询(或任何异步函数)的结果,则应返回将提供最终结果的LiveData。调用者可以观察ViewModel的结果,只要它准备好就可以接收结果。

但是我在ViewModel内部使用getter方法,
getCWeek
,为不同的变量提供动力。在这之前,我在一个普通的java类中添加了这个getter方法,作为一个存储库,但当时它不起作用。那么你能给我一个同样的解决方案吗?不过,谢谢你的回答!好的,那么你的getter得到一个不正确的值,并重用它?您期望的行为与您看到的行为有什么不同?我的getter在
addSnapshotListener
中获取正确的值,但当我将其存储在全局变量中并返回该变量时,该值为null。我正在尝试从firestore接收值,并将其存储在全局变量中,但这没有发生。您可能想再次阅读我的答案。从getCWeek返回的值与在回调中打印的值不同,因为查询是异步的。在将其值返回给调用方之前,尚未设置cWeek。这是一个非常常见的错误,它要求您了解异步函数调用是如何与打印语句的计时相关的。是的,我明白了,但是我应该怎么做才能真正得到结果呢?
D/DashboardViewModel: cWeek AFTER: null
D/DashboardViewModel: cWeek: 1