Android 什么';在SharedReferences中,commit()和apply()之间的区别是什么

Android 什么';在SharedReferences中,commit()和apply()之间的区别是什么,android,sharedpreferences,Android,Sharedpreferences,我正在android应用程序中使用SharedReferences。我正在使用共享首选项中的commit()和apply()方法。当我使用AVD2.3时,它不显示错误,但当我在AVD2.1中运行代码时,apply()方法显示错误 那么这两者之间有什么区别呢?通过仅使用commit()可以存储首选项值而没有任何问题吗?apply()是在2.3中添加的,它提交,而不返回表示成功或失败的布尔值 commit()如果保存有效,则返回true,否则返回false 添加了apply(),因为Android开

我正在android应用程序中使用
SharedReferences
。我正在使用共享首选项中的
commit()
apply()
方法。当我使用AVD2.3时,它不显示错误,但当我在AVD2.1中运行代码时,
apply()
方法显示错误

那么这两者之间有什么区别呢?通过仅使用
commit()
可以存储首选项值而没有任何问题吗?

apply()
是在2.3中添加的,它提交,而不返回表示成功或失败的布尔值

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

添加了
apply()
,因为Android开发团队注意到几乎没有人注意到返回值,所以apply速度更快,因为它是异步的

来自javadoc:

与commit()不同,commit()编写 持久存储的首选项 同步地,apply()提交其 对内存中的 立即共享引用,但 启动对磁盘的异步提交 你不会收到任何通知 失败。如果此SharedReferences上的另一个编辑器在>apply()仍然未完成时执行常规提交(),则提交()将被阻止,直到完成所有异步提交以及提交本身


tl;医生:

  • commit()
    同步写入数据(阻止从其调用的线程)。然后,通知您手术成功
  • apply()
    计划异步写入数据。它不会告诉你手术成功的消息
  • 如果使用
    apply()
    保存,并通过任何getX方法立即读取,则将返回新的
  • 如果在某个时间点调用了
    apply()
    ,但它仍在执行,则对
    commit()
    的任何调用都将被阻止,直到所有过去的apply调用和当前的commit调用完成
文档中的更深入信息:

不同于commit(),它写入 持久存储的首选项 同步地,apply()提交其 对内存中的 立即共享引用,但 启动对磁盘的异步提交 你不会收到任何通知 失败。如果有其他编辑在这上面 SharedReferences执行常规的 当apply()仍处于活动状态时提交() 未完成,commit()将阻止 直到所有异步提交完成 以及承诺本身

与SharedReferences实例一样 进程内的单例,是安全的 替换commit()的任何实例 如果您已经 忽略返回值

SharedReferences.Editor界面 预计不会实施 直接的。但是,如果您以前 我们确实实施了它,现在得到了 关于缺少apply()的错误,您可以 只需从apply()调用commit()


这些文档很好地解释了和之间的区别:

commit()
不同,后者将其首选项写入持久化 同步存储,
apply()
将其更改提交到内存中的
SharedReferences
立即执行,但启动对的异步提交 磁盘,您将不会收到任何故障通知。如果另一个编辑在 此
SharedReferences
执行常规的
commit()
,而
apply()
执行 仍然未完成,
commit()
将阻塞,直到完成所有异步提交 与提交本身一样完成。作为
SharedReferences
实例
如果进程中存在单例,则可以安全地替换 如果已忽略返回值,则使用
apply()
提交()


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

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

如果希望您的首选项处于活动状态,我建议使用“提交()”而不是“应用()”。

使用应用()

它会立即将更改写入RAM,并等待更改完成后将其写入内部存储器(实际首选项文件)。Commit将更改以同步方式直接写入文件

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

  • apply()
    是无效函数

  • commit()
    如果新值成功写入持久存储,则返回true

  • apply()

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

commit()和apply()之间的区别

当我们使用SharedReference时,我们可能会被这两个术语弄糊涂。基本上,它们可能是相同的,所以让我们澄清commit()和apply()的区别

1.返回值:

apply()
提交时不返回表示成功或失败的布尔值。
commit(
)如果保存有效,则返回true,否则返回false

  • 速度:
  • apply()
    更快。
    commit()
    速度较慢

  • 异步v.s.同步:
  • apply()
    :异步
    comm