在我从某个特定用户收集所有数据并进行显示的Activity中,此onDataChange方法会正确地正确触发数据。
final User user = new User();
databaseReference.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
user.setFirstName(dataSnapshot.getValue(User.class).getFirstName());
view_profile_firstName.setText(user.getFirstName().toString());
user.setLastName(dataSnapshot.getValue(User.class).getLastName());
view_profile_lastName.setText(user.getLastName().toString());
user.setEmail(dataSnapshot.getValue(User.class).getEmail());
view_profile_email.setText(user.getEmail().toString());
user.setAge(dataSnapshot.getValue(User.class).getAge());
view_profile_age.setText(Integer.toString(user.getAge()));
user.setGender(dataSnapshot.getValue(User.class).getGender());
view_profile_gender.setText(user.getGender());
user.setProfileComplete(dataSnapshot.getValue(User.class).getProfileComplete());
view_profile_profileComplete.setText(String.valueOf(user.getProfileComplete()));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
}
});
尽管现在我正在尝试在当前用户登录时检查profileComplete是否为true。我希望这种方法的工作方式是,一旦用户注册了一个帐户,他的数据就存储为空字符串并且profileComplete已设置虚假。填写完所有数据并保存配置文件profileComplete后,将其设置为true。原因是当他们在关闭应用程序后重新登录时,我希望它带他们到主屏幕,而不是通过创建配置文件重新运行它们。
这是他们成功使用电子邮件和密码登录后的登录活动的样子。
firebaseAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>()
{
@Override
public void onComplete(@NonNull Task<AuthResult> task)
{
if (task.isSuccessful())
{
final User user = new User();
Toast.makeText(MainActivity.this, "Successful login!", Toast.LENGTH_SHORT).show();
//Dialog related to alerting the user we are logging them in
progressDialog.cancel();
//Check if logging in user has completed profile or not.
databaseReference = firebaseDatabase.getReference("Users/" + firebaseAuth.getInstance().getCurrentUser().getUid());
databaseReference.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
user.setProfileComplete(dataSnapshot.getValue(User.class).getProfileComplete());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
Log.d("MainActivity", "COULD NOT RECIEVE PROFILECOMPLETE FROM DATABASE");
}
});
//The profileComplete method returns TRUE, so we can skip the profile creation.
if(user.getProfileComplete())
{
Intent intent = new Intent(MainActivity.this, ViewProfileActivity.class);
startActivity(intent);
}
//the profileComplete method returns FALSE, we must send the user to the profile creation.
else
{
Intent intent = new Intent(MainActivity.this, ProfileActivity.class);
startActivity(intent);
}
我浏览了大约45分钟到一个小时的stackoverflow,以查看各种解决方案,例如尝试使用异步处理。
我的假设是,因为这都是在主线程上运行的,所以onDataChange方法不会及时将其数据用于if语句。尽管尝试解决此问题,我还是把
databaseReference.addValueEventListener(new ValueEventListener()
在while循环中,布尔变量设置为false,只有在onDataChanged()方法触发后才将其设置为true。尽管这似乎从未发生过,但现在我还是很困惑。
非常感谢所有帮助,请发送指向我可以阅读的文档的链接,以加深我对该主题的理解。
答案 0 :(得分:0)
您已经在问题中描述了导致此问题的原因。因此,解决此问题的一种方法如下-
databaseReference = firebaseDatabase.getReference("Users/" + firebaseAuth.getInstance().getCurrentUser().getUid());
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
user.setProfileComplete(dataSnapshot.getValue(User.class).getProfileComplete());
//The profileComplete method returns TRUE, so we can skip the profile creation.
if(user.getProfileComplete()) {
Intent intent = new Intent(MainActivity.this, ViewProfileActivity.class);
startActivity(intent);
}
//the profileComplete method returns FALSE, we must send the user to the profile creation.
else {
Intent intent = new Intent(MainActivity.this, ProfileActivity.class);
startActivity(intent);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("MainActivity", "COULD NOT RECIEVE PROFILECOMPLETE FROM DATABASE");
}
});