SharedPreferences存储Boolean值始终返回false问题求助
问题排查与解决方案
以下是针对你遇到的sudahBelajar值始终为false问题的具体排查方向和修复方案:
Editor实例引用有效性问题
你当前在onCreate中提前初始化SharedPreferences.Editor,并在点击事件的匿名内部类中引用。若Activity因配置变化(如屏幕旋转)重建,旧实例的Editor可能无法正确写入数据。建议在点击事件内部动态获取Editor:bttnBelajar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { bttnBelajar.setVisibility(View.GONE); Fragment fragment = new materisatuFragment(); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.materiSatu, fragment).commit(); // 点击时重新获取SharedPreferences和Editor SharedPreferences sharedPreferences = getSharedPreferences("PREFERENSI_APP", MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("sudah_belajar", true); editor.apply(); } });异步保存延迟问题
apply()是异步写入磁盘的操作,如果用户点击学习按钮后立刻触发测验,可能保存还未完成,导致读取旧值。可改用同步的commit()(小数据量下对主线程影响可忽略),并检查保存结果:editor.putBoolean("sudah_belajar", true); boolean saveSuccess = editor.commit(); // 可通过日志查看是否保存成功 Log.d("SaveStatus", "保存结果:" + saveSuccess);验证代码执行流程
添加日志确认保存和读取逻辑是否正常执行:
保存时:Log.d("MateriSatu", "开始设置sudah_belajar为true"); editor.putBoolean("sudah_belajar", true); editor.apply(); Log.d("MateriSatu", "保存操作已执行");读取时:
boolean sudahBelajar = prefs.getBoolean("sudah_belajar", false); Log.d("QuizStart", "读取到sudahBelajar值:" + sudahBelajar);通过日志可以确认数值是否被正确保存和读取。
排查数据重置逻辑
检查应用其他代码中是否存在修改sudah_belajar为false的逻辑,比如测验结束后的状态重置、应用启动时的初始化操作等。多进程场景问题
若应用使用多进程(如后台Service在独立进程),MODE_PRIVATE无法保证数据跨进程同步。此时建议改用Jetpack DataStore替代SharedPreferences,或使用ContentProvider实现跨进程数据访问。
内容的提问来源于stack exchange,提问作者andini s
相关产品推荐
相关产品推荐

