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
相关产品推荐
相关产品推荐

