使用SharedPreferences保存加载待办列表失败问题求助
我帮你排查了代码里的几个关键问题,这些就是导致功能失效的核心原因:
1. SharedPreferences 名称不匹配
你的loadData()方法里使用的SharedPreferences名称是"shared preferences",但saveData()里用的是"todo list"——这两个必须完全一致,否则加载时会找不到正确的存储文件,自然读不到之前保存的数据。
2. 存储键名拼写错误
loadData()里的键写成了"task lisk"(注意是lisk而非list),但saveData()里的键是"task list",拼写不一致直接导致读取不到对应的数据。
3. 未在合适时机触发保存
你的onPause()方法是空实现,没有调用saveData()。Android中,当Activity进入后台(比如切换应用、按Home键)或销毁时,onPause()会被调用,这是保存数据的最佳时机之一,漏掉这一步的话,数据根本没机会写入SharedPreferences。
4. initialStart 逻辑存在隐患
如果initialStart是普通的类成员变量,每次Activity重启都会重置为初始值(比如true),这会导致每次启动都尝试加载数据,但如果initialStart没有持久化,逻辑会混乱。其实完全可以去掉这个判断,直接每次启动都尝试加载数据——如果没有保存过数据,gson.fromJson()会返回null,后续的null判断会自动初始化空列表。
修正后的完整代码示例
修正后的 loadData() 方法
private void loadData() { // 统一使用同一个SharedPreferences名称,避免混淆 SharedPreferences sharedPreferences = getSharedPreferences("todo_prefs", MODE_PRIVATE); Gson gson = new Gson(); // 统一键名,修正拼写错误 String json = sharedPreferences.getString("task_list", null); Type type = new TypeToken<ArrayList<Record>>() { }.getType(); // 直接加载数据,无需initialStart判断 AddItemActivity.listItems = gson.fromJson(json, type); // 如果加载结果为null,初始化空列表 if (AddItemActivity.listItems == null) { AddItemActivity.listItems = new ArrayList<>(); } // 初始化或更新Adapter if (adapter == null) { adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, AddItemActivity.listItems); // 记得给你的ListView设置Adapter,比如: // ListView listView = findViewById(R.id.your_listview_id); // listView.setAdapter(adapter); } else { adapter.notifyDataSetChanged(); } }
修正后的 saveData() 方法
public void saveData() { // 和loadData使用完全一致的SharedPreferences名称 SharedPreferences sharedPreferences = getSharedPreferences("todo_prefs", MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); Gson gson = new Gson(); String json = gson.toJson(AddItemActivity.listItems); // 统一键名 editor.putString("task_list", json); editor.apply(); }
修正后的 onPause() 方法
@Override protected void onPause() { super.onPause(); // 每次Activity暂停时保存数据 saveData(); }
额外优化建议
尽量避免使用AddItemActivity.listItems这种静态成员变量来共享数据,静态引用容易持有Activity的上下文,导致内存泄漏。更好的方案是:
- 使用
Intent传递数据到AddItemActivity - 借助
ViewModel来跨组件管理列表数据 - 封装一个单例类专门处理待办数据的存储与读取
内容的提问来源于stack exchange,提问作者Antrophy
相关产品推荐
相关产品推荐

