Java 为什么FirebaseUser DisplayName没有更新?

Java 为什么FirebaseUser DisplayName没有更新?,java,android,firebase,android-activity,firebase-authentication,Java,Android,Firebase,Android Activity,Firebase Authentication,我的Firebase身份验证是基于电子邮件的(登录和注册只需要电子邮件和密码),由Firebase随后管理 我的注册活动也要求提供电子邮件、密码和姓名,因为我想稍后在我的AccountActivity中使用它,以便在登录后获得类似“Hello,[Name]”的内容。为了保存此名称,幸运的是,FirebaseUser已经有一个名为DisplayName的字段,所以我所要做的就是在创建用户后立即更新它(createUserWithEmailAndPassword(…)也会自动进行“登录”) 注册表活

我的Firebase身份验证是基于电子邮件的(登录和注册只需要电子邮件和密码),由Firebase随后管理

我的注册活动也要求提供电子邮件、密码和姓名,因为我想稍后在我的AccountActivity中使用它,以便在登录后获得类似“Hello,[Name]”的内容。为了保存此名称,幸运的是,FirebaseUser已经有一个名为DisplayName的字段,所以我所要做的就是在创建用户后立即更新它(createUserWithEmailAndPassword(…)也会自动进行“登录”)

注册表活动相关代码:

firebaseAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (!task.isSuccessful()) {
                            Toast.makeText(RegisterActivity.this, "Could not complete registration", Toast.LENGTH_SHORT).show();
                        } else {
                            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                            UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                                    .setDisplayName(name).build();
                            user.updateProfile(profileUpdates);
                            Toast.makeText(RegisterActivity.this, "Update complete", Toast.LENGTH_SHORT).show();

                            startActivity(new Intent(RegisterActivity.this, AccountActivity.class));
                            finish();

                        }


                    }
                });
我的假设是,在登录时,更新当前登录的用户在再次启动活动之前不会对其进行更改,但我对此表示怀疑,因为在AccountActivty上按back(后退)将首先使用正确的显示名再次打开它,然后再按back(后退)将正确关闭它

为什么先按back并没有关闭它,而是将TextView更新为正确的显示名?为什么第一次没有正确更新?
很抱歉,如果我没有发布所有必要的信息,请告诉我。

要解决此问题,只需移动以下代码行:

accountTextView.setText(user.getDisplayName());
在回调中,就在以下位置之后:

Toast.makeText(RegisterActivity.this, "Update complete", Toast.LENGTH_SHORT).show();

尝试在回调之外设置用户名没有任何意义,因为Firebase API是异步的。因此,解决此问题的最快解决方案(如您所见)是仅在
onComplete()方法中使用
user.getDisplayName()
。如果您想在回调之外使用它,我建议您查看我的anwser的最后一部分,我在其中解释了如何使用自定义回调。您还可以查看此以便更好地理解。

您是否有mainactivity?是的,这是登录活动。您的登录活动是否检查了用户是否已登录?
user.updateProfile(profileUpdates)
是一个异步操作,您将在得到响应之前启动新活动。这就是为什么名字会在某个时间后出现(下次渲染时)。哦,好的,谢谢!有道理Hello,对不起,我忘了正确标记。是的,你的回答很有帮助。还有视频!非常感谢你的回答!
Toast.makeText(RegisterActivity.this, "Update complete", Toast.LENGTH_SHORT).show();