首页 文章

共享首选项中commit()和apply()之间的区别是什么

提问于
浏览
373

我在我的Android应用程序中使用共享首选项 . 我正在使用共享首选项中的 commit()apply() 方法 . 当我使用AVD 2.3时它没有显示错误,但是当我在AVD 2.1中运行代码时, apply() 方法显示错误 . 那么这两者有什么区别?并且只使用 commit() 可以存储首选项值而没有任何问题吗?

7 回答

  • 586

    apply() 在2.3中添加,它提交 without 返回一个表示成功或失败的布尔值 .

    如果保存有效, commit() 将返回 true ,否则返回 false .

    apply() 被添加,因为Android开发团队注意到几乎没有人注意到返回值,因此应用更快,因为它是异步的 .

    http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()

  • 21
    • commit() 是同步的, apply() 是异步的

    • apply() 是无效功能 .

    如果新值已成功写入持久存储,

    • commit() 将返回true .

    • apply() 保证在切换状态之前完成,您无需担心Android组件的生命周期

    如果您不使用从 commit() 返回的值并且您从主线程使用 commit() ,请使用 apply() 而不是 commit()

  • 11

    来自javadoc:

    与commit()同步地将其首选项写入持久存储,apply()会立即将其更改提交到内存中的SharedPreferences,但会启动异步提交到磁盘,并且不会通知您任何失败 . 如果此SharedPreferences上的另一个编辑器执行常规commit()而> apply()仍然未完成,则commit()将阻塞,直到完成所有异步提交以及提交本身

  • 5

    tl;dr:

    • commit() 写入数据 synchronously (阻塞其调用的线程) . 然后 informs 你关于操作的成功 .

    • apply() 安排要写入的数据 asynchronously . 它 does not inform 你关于操作的成功 .

    • 如果使用 apply()immediately read 通过任何getX方法保存,将返回 new 值!

    • 如果您在某个时刻调用 apply() 并且它仍在执行,则对 commit() 的任何调用都将阻塞,直到所有过去的apply-calls和当前的commit-call完成为止 .

    来自SharedPreferences.Editor文档的更深入信息:

    与commit()同步地将其首选项写入持久存储,apply()会立即将其更改提交到内存中的SharedPreferences,但会启动异步提交到磁盘,并且不会通知您任何失败 . 如果此SharedPreferences上的另一个编辑器在apply()尚未完成时执行常规commit(),则commit()将阻塞,直到完成所有异步提交以及提交本身 . 由于SharedPreferences实例是进程中的单例,因此如果您已经忽略了返回值,则可以使用apply()替换commit()的任何实例 . SharedPreferences.Editor接口不应直接实现 . 但是,如果您以前执行过它并且现在收到有关缺少apply()的错误,则只需从apply()调用commit()即可 .

  • 10

    文档对apply()commit()之间的区别给出了很好的解释:

    与commit()同步地将其首选项写入持久存储,apply()会立即将其更改提交到内存中的SharedPreferences,但会启动异步提交到磁盘,并且不会通知您任何失败 . 如果此SharedPreferences上的另一个编辑器在apply()尚未完成时执行常规commit(),则commit()将阻塞,直到完成所有异步提交以及提交本身 . 由于SharedPreferences实例是进程中的单例,因此如果您已经忽略了返回值,则可以使用apply()替换commit()的任何实例 .

  • 187

    我在使用apply()而不是commit()时遇到了一些问题 . 如前所述,在其他响应中,apply()是异步的 . 我遇到的问题是,对“字符串集”首选项形成的更改永远不会写入持久性内存 .

    如果您“强制拘留”程序,或者在我使用Android 4.1安装在我的设备上的ROM中,当系统由于内存需要而导致该进程被终止时,就会发生这种情况 .

    如果您希望您的首选项存活,我建议使用“commit()”而不是“apply()” .

  • 12

    使用apply() .

    它立即将更改写入RAM并等待并将其写入内部存储(实际首选项文件)之后 . Commit将更改同步并直接写入文件 .

相关问题