[英]addOnCompleteListener is completely skipped when getting user from firebase
I have the following in a login activity that gets triggered to sign in a user to my app:我在登录活动中具有以下内容,该活动被触发以将用户登录到我的应用程序:
mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
...
LoggedInUser loggedInUser = LoggedInUser.getInstance();
Toast.makeText(LoginActivity.this, getString(R.string.welcome_back) + loggedInUser.getUser().name, Toast.LENGTH_LONG).show();
The sign in and the listener above are successfully triggered.上面的登录和监听器都成功触发了。 However, I am having an issue occur on that Toast line where I call loggedInUser.getUser().name但是,我在调用loggedInUser.getUser().name的 Toast 行上出现问题
public User getUser() {
if (user == null) {
FirebaseAuth mAuth = FirebaseAuth.getInstance();
String userID = mAuth.getCurrentUser().getUid();
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users").child(userID);
databaseReference.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (!task.isSuccessful()) {
Log.e("firebase", "Error getting data", task.getException());
}
else {
User currUser = task.getResult().getValue(User.class);
user = currUser;
}
}
});
}
return user;
}
What happens here is that databaseReference.get().addOnCompleteListener never gets triggered so user is never set, it returns null and the app crashes.这里发生的是databaseReference.get().addOnCompleteListener永远不会被触发,因此永远不会设置用户,它返回 null 并且应用程序崩溃。
I utilized the same code I have in getUser to set a user elsewhere with no issues so I am not sure what I am missing here that is causing the listener to be skipped.我使用 getUser 中的相同代码在其他地方设置用户没有问题,所以我不确定我在这里缺少什么导致侦听器被跳过。 I am new to firebase so any help to understand and fix this is appreciated!我是 firebase 的新手,因此感谢您对理解和解决此问题的任何帮助!
Not sure if I fully understand your code but you can get your user object from mAuth.getCurrentUser()
inside signInWithEmailAndPassword
.不确定我是否完全理解您的代码,但您可以从 signInWithEmailAndPassword 中的mAuth.getCurrentUser()
获取您的用户signInWithEmailAndPassword
。
Also bear in mind that calls to the Firebase database are asynchronous.还要记住,对 Firebase 数据库的调用是异步的。 So this means in your getUser()
method, you'll probably get a null return when you enter the if == null
block ie your addOnCompleteListener
executes after your return user
statement.所以这意味着在您的getUser()
方法中,当您输入if == null
块时,您可能会得到 null 返回,即您的addOnCompleteListener
在您的return user
语句之后执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.