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

多Activity场景下SharedPreference值无法在Fragment中获取的技术求助

问题排查与解决方案

嘿,我看了你的代码,发现几个关键问题,尤其是一个低级拼写错误很可能是导致你拿不到SharedPreferences值的核心原因,我们一步步来修复:

1. 先修复致命的拼写错误

你在ActivityTwo登录后的保存代码里,把JSONException写成了JSONEceeption——这个错误会让你的catch块无法正常编译,直接导致onResponse里的token保存逻辑执行失败,token根本没被写入SharedPreferences!

赶紧改成正确的写法,同时建议在catch块里加日志,方便后续排查:

catch(JSONException e) {
    e.printStackTrace();
    Log.e("ActivityTwo", "解析Token失败", e);
}

2. 规范SharedPreferences的初始化

你在onResponse方法里重复声明了SharedPreferences prefs,prefs1;,这会导致变量作用域混乱,建议把SharedPreferences实例提升为Activity的成员变量,在onCreate里初始化:

// ActivityTwo的成员变量
private SharedPreferences myPrefs;
private SharedPreferences.Editor myPrefsEditor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_two);
    // 提前初始化SharedPreferences和Editor
    myPrefs = getSharedPreferences("myPrefs", MODE_PRIVATE);
    myPrefsEditor = myPrefs.edit();
    // 其他初始化逻辑...
}

// 在onResponse里直接使用已初始化的实例
@Override
public void onResponse(JSONObject response) {
    try {
        String saveToken = response.getString("token");
        myPrefsEditor.putString("token", saveToken);
        myPrefsEditor.apply();
        Log.i("ActivityTwo", "Token已保存: " + saveToken); // 打印日志确认保存成功
    } catch(JSONException e) {
        e.printStackTrace();
        Log.e("ActivityTwo", "解析Token失败", e);
    }
}

3. 验证SharedPreferences的提交状态

apply()是异步写入磁盘的,虽然大多数时候没问题,但如果保存后立刻跳转ActivityThree,极端情况下可能还没完成写入。可以暂时换成同步的commit()测试,它会返回布尔值告诉你是否保存成功:

boolean saveSuccess = myPrefsEditor.commit();
Log.i("ActivityTwo", "Token保存结果: " + saveSuccess);

4. 确保Fragment获取SharedPreferences时上下文有效

在Fragment里,尽量在onViewCreated之后获取SharedPreferences,用requireActivity()代替getActivity(),避免上下文为空的情况:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    SharedPreferences prefs = requireActivity().getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
    String myToken = prefs.getString("token", "empty");
    Log.i("MyFragment", "获取到的Token: " + myToken); // 打印获取到的值,方便排查
}

5. 检查退出时的移除逻辑

确认退出应用时的移除逻辑是正确的,不要依赖未初始化的变量:

// ActivityTwo的退出对话框逻辑里,直接初始化SharedPreferences
AlertDialog.Builder builder = new AlertDialog.Builder(ActivityTwo.this);
builder.setTitle("Exit App");
builder.setMessage("Do you really want to Exit ?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        SharedPreferences prefs = getSharedPreferences("myPrefs", MODE_PRIVATE);
        SharedPreferences.Editor edit = prefs.edit();
        edit.remove("token");
        edit.apply();
        finish();
    }
});

按照上面的步骤修复,尤其是第一个拼写错误,应该就能解决你无法获取Token的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:34:20