23

我创建了一个应用程序,它使用共享首选项以便用户登录。用户的密码保存在首选项中。我的问题是,如果用户想更改他/她的密码,我该如何更改首选项中的密码?

4

2 回答 2

49
SharedPreferences prefs = ... // you already know how to use prefs and have one of this objects
Editor editor = prefs.edit();
editor.putString("password", "new value");
editor.apply();
于 2011-01-28T03:08:50.623 回答
8

使用apply()代替commit()

建议您使用Editor.apply()而不是因为commit()apply()后台异步工作,因此不太可能因此出现 ANR(如果有的话)。

getSharedPreferences("FILE_NAME", 0 /*FILE_MODE*/)
     .edit()
     .putString("password", "new value")
     .apply();

文档提到apply()

将您的首选项更改从该编辑器提交回它正在编辑的 SharedPreferences 对象。这会自动执行请求的修改,替换 SharedPreferences 中当前的任何内容。

请注意,当两个编辑器同时修改首选项时,最后一个调用 apply 的人获胜。

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

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

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

于 2017-07-01T08:24:36.197 回答