【发布时间】:2019-11-06 09:18:36
【问题描述】:
所以,我现在正面临这个奇怪的问题。我必须在我的 Android 应用程序中使用 SharedPreferences.Editor().commit(),但是,正如文档 here 所述,
由于 SharedPreferences 实例是进程中的单例,因此它是 如果您是,可以安全地用 apply() 替换任何 commit() 实例 已经忽略了返回值。
您无需担心 Android 组件生命周期及其 与 apply() 写入磁盘的交互。该框架确保 来自 apply() 的动态磁盘写入在切换状态之前完成。
如果您不使用返回值BUT、here 中提到的两者之间的差异以及 Android 中的警告,基本上可以安全地将 commit() 替换为 apply() Studio 表示,commit() 会立即写入数据,但是 apply() 是异步执行的。
所以我的问题是,我正在更改我的应用程序中的语言,并且我想在用户选择语言后重新启动我的应用程序。但是,当用户选择语言时,当前选择的语言会放在SharedPreferences。
现在,问题来了:
每当我使用apply() 而不是commit() 并使用代码重新启动应用程序here 重新启动我的应用程序时,更改不会写入磁盘,因为当应用程序重新启动时,它不会更改当前语言,因为来自SharedPreference 的值没有改变,因为它没有立即写入磁盘。但是,每当我使用commit()时,更改都会立即写入,并且在应用重新启动时成功更改语言。
那么问题来了:
为
commit()和apply()编写代码的人怎么能说使用apply()而不是commit()是完全安全的,如果差别很大的话,正如commit()所写立即获取数据,但apply()在后台处理?如果我构建我的 apk,如果我不使用返回值,
commit()是否会在代码优化中被替换为apply()。(我知道我可以通过构建应用程序,但我仍然不确定,因为当我使用apply()时,它经常 1/10 倍实际上从 SharedPreference 更改值)
备注:
- 我知道如何使用 Apply() 并且仍然使我的应用程序正常工作,也许我必须在重新启动应用程序之前添加一些延迟?但我不确定它是如何工作的,因为将数据实际写入磁盘仍然需要一些时间,而且我目前没有看到任何方法来检查 SharedPreference 值是否实际更改,所以我可以值更改后安全重启。
【问题讨论】:
标签: java android sharedpreferences