You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase应用更新用户信息后无法实时同步,重启仍无效求助

解决Firebase用户信息更新后无需重启即可同步显示的问题

你遇到的核心问题有两个:一是更新操作完成后本地缓存的用户信息没及时刷新,二是当前代码没有等待updateProfile异步操作完成就重启应用,导致更新可能还没真正生效。咱们一步步来解决:

1. 确保updateProfile操作完成后再处理后续逻辑

你现在的代码里,调用user.updateProfile(profileUpdate)后没有等待它完成就直接重启应用了,但这个方法是异步的——也就是说,重启操作可能在Profile真正更新到服务器之前就执行了,这就会导致重启后还是旧数据。

修改updateDisplayNameOnly方法,给updateProfile添加OnCompleteListener,确保更新成功后再刷新UI:

private void updateDisplayNameOnly() {
    showProgress();
    AuthCredential credential = EmailAuthProvider
            .getCredential(FirebaseAuth.getInstance().getCurrentUser().getEmail(), mConfirm.getText().toString());
    FirebaseAuth.getInstance().getCurrentUser().reauthenticate(credential)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                        UserProfileChangeRequest profileUpdate = new UserProfileChangeRequest.Builder()
                                .setDisplayName(mName.getText().toString())
                                //.setPhotoUri(Uri.parse("https://avatarfiles.alphacoders.com/862/86285.jpg"))
                                .build();
                        
                        // 等待updateProfile异步操作完成
                        user.updateProfile(profileUpdate)
                                .addOnCompleteListener(new OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Void> updateTask) {
                                        if (updateTask.isSuccessful()) {
                                            Log.d(TAG, "onComplete: User Profile updated successfully");
                                            Toast.makeText(getActivity(), "Name is updated", Toast.LENGTH_SHORT).show();
                                            // 直接刷新UI,不需要重启应用
                                            refreshUserInfoDisplay();
                                        } else {
                                            Toast.makeText(getActivity(), "Failed to update profile", Toast.LENGTH_SHORT).show();
                                            Log.e(TAG, "Profile update failed", updateTask.getException());
                                        }
                                        hideProgress();
                                    }
                                });
                    } else {
                        Toast.makeText(getActivity(), "Name was not updated", Toast.LENGTH_SHORT).show();
                        hideProgress();
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    hideProgress();
                    Toast.makeText(getActivity(), "You have entered wrong password", Toast.LENGTH_SHORT).show();
                }
            });
}

2. 直接刷新当前UI显示的用户信息

添加一个refreshUserInfoDisplay方法,用来更新Fragment里显示姓名、邮箱等信息的控件,这样用户就能立刻看到变更:

private void refreshUserInfoDisplay() {
    FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
    if (currentUser != null) {
        // 假设你有一个显示姓名的TextView叫tvDisplayName
        if (tvDisplayName != null) {
            tvDisplayName.setText(currentUser.getDisplayName());
        }
        // 如果还有其他信息需要更新,比如邮箱,也在这里处理
        // if (tvEmail != null) {
        //     tvEmail.setText(currentUser.getEmail());
        // }
    }
}

3. 强制刷新Firebase用户缓存(可选)

如果有时候本地缓存的用户信息没有自动更新,可以调用reload()方法强制从服务器获取最新数据,把这段代码加在updateProfile成功的回调里即可:

user.reload().addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> reloadTask) {
        if (reloadTask.isSuccessful()) {
            // 重新获取用户信息,确保是最新的
            FirebaseUser updatedUser = FirebaseAuth.getInstance().getCurrentUser();
            refreshUserInfoDisplay();
        }
    }
});

关于你的restartApp方法无效的原因

之前重启后变更没生效,大概率是因为updateProfile还没完成就重启了,服务器上的信息还没更新,重启后获取的还是旧的缓存数据。现在确保updateProfile完成后再操作,就不会有这个问题了,而且完全不需要重启应用。

内容的提问来源于stack exchange,提问作者user7838657

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:48:48