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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:05:03