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