Android的SharedPreferences commit()什么时候返回false?

Irc*_*ver 19 android sharedpreferences

在我的应用程序中,我正在存储一些数据SharedPreferences- 它可以根据需要运行.现在我想为一些不正确的情况创建日志消息.

我成功处理了首选项为空或在加载时抛出异常的情况.在保存值时可以显示的唯一错误是commit()返回false- 我不知道为什么会发生这种情况以及在这种情况下我应该做些什么.

所以我的问题是:该commit()方法何时返回false?在那种情况下我该怎么办?一个可能的解决方案是commit()一次又一次地呼叫(类似的东西while (!editor.commit()) {})?

aga*_*aga 11

And can while(!editor.commit()) {;} be solution for success anyway?

'commit'操作是同步的并且在UI线程上执行,因此,如果每次尝试执行时都会发生一些不可恢复的错误commit,那么您将使用此代码阻止整个UI线程,用户将看到ANR.不好.
另一方面,'apply'是异步的,因此即使你将无限期地执行它,它也无法阻止UI线程.
文档很少谈到"提交"操作可能出现的故障(请点击此处,此处此处).首选项存储在存储在内部存储器中的xml文件中,因此可能的一个失败可能是损坏的xml文件.第二个可以在文档中找到:

请注意,当两个编辑器同时修改首选项时,最后一个调用commit会获胜.

关于损坏的文件几乎无法做到,而且,不要尝试同时修改来自不同位置的首选项.:)


Pau*_*ulR 11

首先,你永远不想做: while(!editor.commit()) {;}.如果你想重试一个提交,你会做几次,而不是永远循环.

关于commit()何时返回-1:commit()和apply()都会对内存进行更改,然后进行调用以将更改写入磁盘(每个源).commit()等待磁盘写入返回以返回结果.因此,您的问题的答案是:"将偏好状态保存到磁盘时,您的特定commit()调用将失败." 由于更改反映在内存中,因此在您尝试写入磁盘之前或之后,可能会或可能不会通过另一个commit()或apply()调用将其写入磁盘(想想赛车线程).由于没有代码可以回滚内存更新而SharedPreferences是单例(每个源代码),即使它们没有保存到磁盘,应用程序中的其他组件也会看到您的更改.

总之,循环几次(不是永远)以确保提交()写入磁盘似乎很好,让你通过一个间歇性的I/O问题,但它是一个罕见的基于I/O的情况,它失败.如果您需要完美的提交范围,您可能需要重新读取磁盘以验证每个commit()调用,该调用具有性能影响并且对于除一小部分情况之外的所有情况都是过度的.


小智 5

commit() 如果在保存数据时出现问题,则可以返回false.

看看之间的区别commit()apply()获得更清晰的想法(取自本网站)

应用()

这会立即将数据保存到内存中,并将数据保存到单独的线程上.所以没有机会阻止主线程(你的应用程序不会挂起).

这是首选技术,但自Gingerbread(API 9,Android 2.3)以来才可用.

承诺()

调用它会将数据保存到文件中,但是,该过程在调用它的线程中执行,在保存完成之前停止其他所有操作.成功完成后返回true,失败时返回false.

如果您需要确认保存数据是否成功,或者您是否正在为姜饼设备开发,请使用commit().自API 1起,commit()已可用