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

