Android中SharedPreference代码被跳过,会话存储异常问题排查
嘿,我看了你贴的代码,发现几个可能导致你遇到问题的点,咱们一步步来捋清楚:
1. 重复提交SP修改是大忌!
你在onPostExecute里同时调用了editor.apply()和editor.commit(),这两个方法都是用来提交SP修改的,但作用机制不一样:
apply()是异步提交,不会阻塞当前线程,没有返回值commit()是同步提交,会阻塞线程直到完成,还会返回布尔值告诉你是否提交成功
同时调用这俩会导致提交逻辑冲突,很可能影响后续的读取操作,这是第一个要改的地方——留其中一个就行,推荐在需要确认提交结果的时候用commit(),否则用apply()更高效。
2. 键名不匹配,读不到数据!
你定义了全局常量public static final String EmployeeID = "employeeID";(值是小写开头的employeeID),但读取的时候却写了sharedpreferences.getString("EmployeeID", "");——这里手动写的键名是大写开头的EmployeeID,和你存储时用的常量值完全不匹配!
这种拼写/大小写错误会导致你读不到任何数据,而且如果后续逻辑依赖这个值,就会出现"代码被跳过"的错觉。
3. 页面跳转太急,日志没来得及输出!
你读取数据后立刻调用了startActivity跳转到MainActivity,如果LoginActivity被销毁(比如你没在Manifest里设置特殊启动模式,或者跳转后自动finish了),LogCat可能因为Activity生命周期结束,没来得及输出后续的日志,让你误以为代码没执行。
修复后的代码示例
把这些问题都修正后,你的onPostExecute应该改成这样:
protected void onPostExecute(Employee results){ if (results != null){ SharedPreferences.Editor editor = sharedpreferences.edit(); // 使用全局常量作为键,避免拼写错误 editor.putString(EmployeeID, results.getEmployeeID()); editor.putString(EmployeeName, results.getFirstName()+" "+results.getLastName()); // 只保留一种提交方式,这里用commit来确认结果 boolean isSavedSuccess = editor.commit(); Log.i("SP Debug", "数据保存是否成功:" + isSavedSuccess); // 同样用全局常量读取数据 String empId = sharedpreferences.getString(EmployeeID, ""); String empName = sharedpreferences.getString(EmployeeName, ""); Log.i("SP Data", "读取到的员工ID:" + empId + ",员工姓名:" + empName); Toast.makeText(LoginActivity.this, "Authenticated", Toast.LENGTH_SHORT).show(); // 最后再执行页面跳转,确保日志已经输出 Intent i = new Intent(getApplicationContext(), MainActivity.class); startActivity(i); // 如果不需要再回到登录页面,加上finish()销毁当前Activity finish(); } else { Toast.makeText(LoginActivity.this, "Invalid ID", Toast.LENGTH_SHORT).show(); } }
额外的调试小技巧
- 用Android Studio的Device File Explorer直接查看SP文件:找到
data/data/你的应用包名/shared_prefs/MyPrefs.xml,打开就能看到存储的实际内容,确认数据是否真的被保存了。 - 在
onCreate里也打印读取到的SP数据,看看App启动时能不能读到之前存储的会话信息,验证持久化是否正常。
内容的提问来源于stack exchange,提问作者zanacar
相关产品推荐
相关产品推荐

