Android如何保存当前时间日期 SharedPreferences存储重启不生效如何解决
问题根因分析
- 你当前代码的核心问题是:从SharedPreferences读取到历史存储的时间值后,没有主动赋值给
textView做界面展示,导致重启应用后虽然已经拿到了历史时间,但界面没有渲染,看起来就像功能失效 - 次要问题:当前时间更新逻辑仅在点击
cardView时触发,如果用户进入页面没有点击卡片,mydate变量不会更新,存储的永远是上次点击的时间,不符合「最后一次访问时间」的需求 - 潜在风险:
onPause中通过getActivity().getBaseContext()拿上下文的方式不稳定,如果Fragment和Activity解绑时触发onPause,getActivity()可能返回空引发崩溃
修复后代码
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); CardView cardView = view.findViewById(R.id.card_view2); textView = view.findViewById(R.id.dateTv); // 读取本地存储的历史访问时间 SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(requireContext()); mydate = getPrefs.getString("Test",""); // 修复点1:读取到历史值后直接更新界面 textView.setText(mydate); // 修复点2:进入页面直接更新当前访问时间,不需要等用户点击,符合最后一次访问的需求 // 如果你的业务逻辑确实需要点击才更新时间,删除这段即可 Calendar calendar= Calendar.getInstance(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy 'at' HH:mm:ss", Locale.getDefault()); mydate = simpleDateFormat.format(calendar.getTime()); textView.setText(mydate); cardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Calendar calendar= Calendar.getInstance(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy 'at' HH:mm:ss", Locale.getDefault()); mydate = simpleDateFormat.format(calendar.getTime()); textView.setText(mydate); } }); } @Override public void onPause() { super.onPause(); // 修复点3:用requireContext()获取上下文,避免空指针 SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("Test", mydate); editor.apply(); }
额外优化建议
- 如果你对时间存储的可靠性要求高,可以把
editor.apply()换成editor.commit(),apply()是异步写入磁盘,极端情况下App被强制杀进程可能丢失写入,commit()是同步写入,可靠性更高但会阻塞主线程,可按需选择 - 可以把SharedPreferences的存储key、时间格式字符串抽成全局静态常量,避免后续写错key导致读取不到值
内容的提问来源于stack exchange,提问作者Charlie Brown
相关产品推荐
相关产品推荐

