在Android代码优化中,SharedPreferences的“ commit()”会自动更改为“ apply()”吗?

Ved*_*agh 5 java android sharedpreferences

所以,我现在正面临这个奇怪的问题。我HAVE使用SharedPreferences.Editor()。提交()在我的Android应用程序,但是,因为文档在这里指出,

由于SharedPreferences实例是流程中的单例,因此如果您已经忽略了返回值,则可以安全地用apply()替换任何commit()实例。

您无需担心Android组件的生命周期及其与apply()写入磁盘的交互。该框架确保在切换状态之前完成对apply()的运行中磁盘写入。

基本上commit()apply()如果您不使用返回值BUT,则可以安全地替换为BUT,这是这里提到的两者之间的区别,并且在Android Studio中警告说,这是commit()立即写入数据,而BUT apply()异步执行。

所以我的问题是,我正在更改应用程序中的语言,并且要在用户选择语言后重新启动应用程序。但是,当用户选择语言时,将输入当前选择的语言SharedPreferences

现在,问题是:

每当我使用代码apply()代替此处commit()的代码并重新启动应用程序以在此处重新启动应用程序时,所做的更改都不会写入磁盘,因为当应用程序重新启动时,它不会更改当前语言,因为from的值SharedPreference不会更改,因为它不会立即写入磁盘。但是,无论何时使用commit(),更改都会立即写入,并且在重新启动应用程序后会成功更改语言。

因此,问题是:

  1. 如果有很大的不同,编写代码commit()apply()声明使用apply()而不是完全安全的人会立即写出数据,但是会在后台执行呢?commit()commit()apply()

  2. 如果我构建了apk,如果我不使用返回值,它将在代码优化中commit()被替换apply()(我知道我可以通过构建应用程序的发行版来知道这一点,但是我仍然不确定,因为当我使用apply()veerery 时,它通常更改1/10次,但确实会从SharedPreference更改值

一张纸条:

  1. 我知道如何使用Apply()并仍然使我的应用程序正常工作,也许我必须在重新启动应用程序之前添加一些延迟?但是我不确定它将如何工作,因为在磁盘上实际写入数据还需要一些时间,而且我目前看不到任何方法来检查SharedPreference值是否已实际更改,因此我可以值更改后,请安全重启。

tyn*_*ynn 5

问题是,使用Runtime.getRuntime().exit(0)System.exit(0)你会终止进程,因此之后不会执行任何计划的异步任务。

如果您不打算更改重新启动代码,则应保留commit而不是apply针对此实例并取消警告。

  1. 可以安全地假设该语句是有效的,因为调用exit(0)是一种边缘情况,您通常不应该这样做。
  2. 没有理由假设它commit会被apply自动替换。如果你想确保它,只需使用返回值。