commit()替换为apply(),但是,如此处所述,并且在Android Studio中作为警告,两者之间的区别是commit()立即写入数据,但是apply()异步执行。
我的问题是,我正在更改应用程序中的语言,并希望在用户选择语言后重新启动应用程序。但是,当用户选择语言时,当前选择的语言被放置在 SharedPreferences 中。
现在的问题是:每当我使用 apply()而不是 commit()并使用代码here重新启动应用程序时,更改未写入磁盘,因为当应用程序重新启动时,它不会更改当前语言,因为 SharedPreference 的值没有更改,因为它不会立即写入磁盘。但是,每当我使用 commit()时,更改会立即写入,并且在应用程序重新启动时成功更改语言。
所以,问题是什么?
如果
commit()和apply()的代码由同一人编写,那么他们怎么能说使用apply()完全安全而不是commit()呢?因为它们之间存在很大的区别,commit()立即写入数据,而apply()则在后台执行。如果我构建我的apk,如果我没有使用返回值,
commit()是否会在代码优化中被apply()取代呢?(我知道可以通过构建应用程序的发布版本来了解这一点,但我仍然不确定,因为当我使用apply()时,它经常只有1/10的机会实际上从SharedPreference更改值)
注:
- 我知道如何使用
apply()并使我的应用程序正常工作,也许我需要在重新启动应用程序之前添加一些延迟?但我不确定它将如何工作,因为它仍然需要一些时间才能真正将数据写入磁盘,并且我目前没有看到任何检查 SharedPreference 值是否实际更改的方法,以便我可以在值更改后安全地重新启动。
exit(0)来终止进程。这可能是唯一一种情况,其中用apply替换commit是不安全的。 - tynn