【问题标题】:Will SharedPreferences "commit()" be automatically changed to "apply()" in Androids code optimization?Androids代码优化中SharedPreferences“commit()”会自动改成“apply()”吗?
【发布时间】:2019-11-06 09:18:36
【问题描述】:

所以,我现在正面临这个奇怪的问题。我必须在我的 Android 应用程序中使用 SharedPreferences.Editor().commit(),但是,正如文档 here 所述,

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

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

如果您不使用返回值BUThere 中提到的两者之间的差异以及 Android 中的警告,基本上可以安全地将 commit() 替换为 apply() Studio 表示,commit() 会立即写入数据,但是 apply() 是异步执行的。

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

现在,问题来了:

每当我使用apply() 而不是commit() 并使用代码重新启动应用程序here 重新启动我的应用程序时,更改不会写入磁盘,因为当应用程序重新启动时,它不会更改当前语言,因为来自SharedPreference 的值没有改变,因为它没有立即写入磁盘。但是,每当我使用commit()时,更改都会立即写入,并且在应用重新启动时成功更改语言。

那么问题来了:

  1. commit()apply() 编写代码的人怎么能说使用apply() 而不是commit() 是完全安全的,如果差别很大的话,正如commit() 所写立即获取数据,但apply() 在后台处理?

  2. 如果我构建我的 apk,如果我不使用返回值,commit() 是否会在代码优化中被替换为 apply()。(我知道我可以通过构建应用程序,但我仍然不确定,因为当我使用 apply() 时,它经常 1/10 倍实际上从 SharedPreference 更改值)

备注:

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

【问题讨论】:

    标签: java android sharedpreferences


    【解决方案1】:

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

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

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

    【讨论】:

    • Android Studio 给出了一个很大的警告,说用 apply 替换 commit 是安全的,所以也许它会替换它?另外,如何在不使用 System.exit(0) 的情况下退出我的应用程序?因为我使用的是那里给出的第二种方法,而不是提到的第一种方法。
    • Android Studio 不希望进程被 exit(0) 杀死。这可能是唯一用apply 替换commit 不安全的情况。
    • 正如@tynn 所说,Android Studio 警告就是一个警告,它会引发潜在问题;在这种特殊情况下,您正在执行将终止进程的异常操作(调用 OS System.exit 方法),这不是共享首选项应用方法在正常情况下预期发生的事情,所以是的,抑制警告没问题;我会留下评论,向下一个必须阅读该代码的可怜人解释它。
    • 是的,也许就是这样。不过,你是对的。但是我想当他们说用 apply() 替换 commit() 是完全安全的时候,那么一定有一些任务队列要写在磁盘上,这与应用程序本身无关? @MartinMarconcini 读到这条评论,我的意思是,如果他们说得对,一定有像我说的那样?
    • ...但是,正如您所发现的,这样做会产生副作用和后果。又名:框架没有预料到的事情,也没有被设计/编程来处理。 :)
    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2018-08-15
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多