[英]Fetch user data during splash screen and pass it to next activity
我正在开发一个Android应用程序,其中需要在应用程序的启动屏幕期间从Firestore检索数据,并使用该文档快照中的特定值来检索另一个文档。 为此,我需要从Firebase的get()函数中获取字符串值。 但是当我尝试这样做时,我没有从函数中获取变量的值:
String userCityL;
DocumentReference docRef = firestoreDB.collection("users").document(mail);
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
String userCityL;
if (document.exists()) {
Log.d(TAG, "DocumentSnapshot data: " + document.getData());
userNameL = document.getString("UserName");
userPhoneL = document.getString("UserPhoneNo");
userDegreeL = document.getString("UserDegree");
userSpecialL = document.getString("UserSpecial");
userCityL = document.getString("UserCity");
userProfilePicL = document.getString("downloadUri");
TextView userCity = findViewById(R.id.tvCity);
userCity.setText(userCityL);
//loadNotesList();
//dummy(userCityL);
//loadNotesList(userCityL);
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
在此, userCityL
变量中未存储任何内容。
您不会在onComplete()
函数之外而不是在get()
函数之外get()
该String的值。 发生这种情况是因为onComplete()
函数具有异步行为。 您也不能简单地创建一个全局变量并在函数外使用它的值,因为它始终为null
。 如果要使用onDataChange()
方法之外的来自数据库的值,则有两种选择。 第一个方法是将所需的对象作为参数传递给您的类中定义的方法,如下所示:
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
String userCityL = document.getString("UserCity");
methodThatDoesSomething(userCityL); //Method call
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
private void methodThatDoesSomething(String userCityL) {
//Do what you need to do with your userCityL object
}
或者,如果你想在一个更复杂的方式,然后潜入的现代API的异步世界,看到我在这个答案的最后一部分后 ,在我所一步解释一步如何您可以使用自定义的回调实现这一目标。 有关更多信息,您也可以观看此视频 。
是的,但是您可能会在从函数中获取结果之前调用该字符串。
尝试将函数放在调用函数内部字符串的位置。
查看Alex Mamo的视频,那里有您的解释。
我使用“共享首选项”解决了这个问题。 我的问题是获取当前登录用户的用户数据,并在所有活动中的整个应用程序中使用此数据。 在这里,我在启动屏幕期间从Firebase提取数据,并将其存储在共享首选项文件中,并在其他活动中使用这些数据。 谢谢 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.