我正在构建一个应用,并试图在用户按下按钮后立即立即获取数据。但是,直到onClickListener的onComplete完成之后,数据获取部分才发生。在onComplete完成之前,我需要访问数据。
现在,我的片段包含一个电子邮件和密码字段,他们将其填写并按下“登录”按钮。我在登录按钮上设置了一个onClickListener
,在其中调用了FirebaseAuth's
signInWithEmailandPassword
方法。这将返回AuthResult任务,我将onCompleteListener设置为该任务。
如果此任务成功,我将触发一个addListenerForSingleValueEvent()
任务,以从Firebase实时数据库中获取相关用户的数据。似乎此任务在onComplete方法之后运行。我该如何改变?我尝试为此使用AsyncTask,但结果是相同的。
我的LoginFragment:
mLogInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
String email = mEmailText.getText().toString();
String password = mPasswordText.getText().toString();
final boolean[] loginSuccess = {false};
Task task = mViewModel.signIn(email,
password).addOnCompleteListener
(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()) {
Log.d(TAG, "signInWithEmail:success");
Toast.makeText(getActivity(),
"Signed in!",
Toast.LENGTH_SHORT).show();
loginSuccess[0] = true;
String uid = mViewModel.getAuth().getUid();
mViewModel.fetchUser(uid);
Log.d(TAG, mViewModel.getUser().getName());
} else {
Log.w(TAG, "signInWithEmail:failure",
task.getException());
Toast.makeText(getActivity(), "Auth failed.
Check log!",
Toast.LENGTH_SHORT).show();
loginSuccess[0] = false;
}
}
});
//Task fetchDatabase = task.addOnCompleteListener(new
//OnCompleteListener() {
//@Override
//public void onComplete(@NonNull Task task) {
// Log.d(TAG, "After!");
// }
//});
// updateUIWithDatabaseDetails(mView);
}
});
我的fetchUser(uid)及其关联的ValueEventListener:
public void fetchUser(String uid) {
mUserDatabase.child(uid).addListenerForSingleValueEvent(userDataValueListener);
}
public ValueEventListener userDataValueListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
Log.d(TAG, "User exists in remote!");
mUser = dataSnapshot.getValue(User.class);
}
else {
Log.d(TAG, "user doesn't exist.");
mUser = null;
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, "Can't fetch Firebase Database user:" + databaseError.getMessage());
mUser = null;
}
};
当前设置立即由于Log.d(TAG, mViewModel.getUser().getName());
处的NullPointerException而崩溃,因为数据库尚未提取用户并在SharedViewModel中更新了用户。
最底线:我认为在Login的onClick的onComplete完成后,数据库提取任务将排队执行。在onComplete运行时,有什么办法可以挤压这个任务?我当时在考虑使用Handler将其从UI线程中移出,但我不太了解它,因此确实需要一些指针。
任何帮助将不胜感激!