Android登录后SharedPreferences数据无法直接显示,需刷新Activity的解决请求
解决方案
核心问题定位
大概率是SharedPreferences写入时机晚于MainActivity读取时机,或者读写时的参数不匹配导致首次读取不到数据。以下是针对性解决步骤:
1. 确保LoginActivity中数据写入完成后再启动MainActivity
Firebase数据加载是异步操作,必须在数据回调完成并写入SharedPreferences后,再跳转至MainActivity,避免跳转后数据还未写入成功。
示例代码(LoginActivity):
// 登录成功后,触发Firebase用户数据加载 FirebaseFirestore.getInstance().collection("users").document(currentUserUid) .get() .addOnSuccessListener(docSnapshot -> { if (docSnapshot.exists()) { Profile profile = docSnapshot.toObject(Profile.class); // 写入SharedPreferences(用commit()同步写入,确保数据落地后再跳转) SharedPreferences sp = getSharedPreferences("UserProfile", MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putString("nickname", profile.getNickname()); editor.putString("avatarUrl", profile.getAvatarUrl()); // 其他字段... editor.commit(); // 同步写入,替代apply()的异步写入,保证数据立即生效 // 数据写入完成后,启动MainActivity Intent intent = new Intent(LoginActivity.this, MainActivity.class); startActivity(intent); finish(); // 关闭LoginActivity,避免返回栈问题 } }) .addOnFailureListener(e -> { // 处理数据加载失败逻辑 });
2. 检查SharedPreferences读写参数一致性
- 确认读取和写入时使用的SharedPreferences名称完全一致(比如示例中的
"UserProfile") - 确认读写的key值完全匹配(比如
"nickname"不能写成"name")
3. MainActivity中正确读取并展示数据
在onCreate方法中直接读取数据并更新UI即可,无需依赖onResume(除非后续有数据更新场景)。
示例代码(MainActivity):
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 首次加载时读取并展示数据 loadAndShowProfileData(); } private void loadAndShowProfileData() { SharedPreferences sp = getSharedPreferences("UserProfile", MODE_PRIVATE); String nickname = sp.getString("nickname", "匿名用户"); String avatarUrl = sp.getString("avatarUrl", ""); // 更新UI TextView tvNickname = findViewById(R.id.tv_nickname); ImageView ivAvatar = findViewById(R.id.iv_avatar); tvNickname.setText(nickname); // 若有头像,可加载网络图片(示例用Glide) // Glide.with(this).load(avatarUrl).into(ivAvatar); }
4. 兜底方案:监听SharedPreferences数据变化
如果上述步骤仍未解决(比如极端情况下异步写入延迟),可以注册监听器,确保数据写入后立即更新UI:
示例代码(MainActivity):
private SharedPreferences.OnSharedPreferenceChangeListener preferenceListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册监听器 preferenceListener = (sp, key) -> { // 数据变化时重新加载UI loadAndShowProfileData(); }; getSharedPreferences("UserProfile", MODE_PRIVATE) .registerOnSharedPreferenceChangeListener(preferenceListener); loadAndShowProfileData(); } @Override protected void onDestroy() { super.onDestroy(); // 销毁时注销监听器,避免内存泄漏 getSharedPreferences("UserProfile", MODE_PRIVATE) .unregisterOnSharedPreferenceChangeListener(preferenceListener); }
内容的提问来源于stack exchange,提问作者Sophism info
相关产品推荐
相关产品推荐

