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

使用SharedPreferences保存加载待办列表失败问题求助

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:05:38