【发布时间】:2011-06-17 00:05:13
【问题描述】:
我创建了一个应用程序,它使用共享偏好来让用户登录。用户的密码保存在首选项中。我的问题是,如果用户想更改他/她的密码,我该如何更改首选项中的密码?
【问题讨论】:
标签: java android sharedpreferences
我创建了一个应用程序,它使用共享偏好来让用户登录。用户的密码保存在首选项中。我的问题是,如果用户想更改他/她的密码,我该如何更改首选项中的密码?
【问题讨论】:
标签: java android sharedpreferences
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();
【讨论】:
apply() 而不是commit()
建议您使用 Editor.apply() 而不是 commit(),因为 apply() 在后台异步工作,因此不太可能出现 ANR(如果有的话) )。
getSharedPreferences("FILE_NAME", 0 /*FILE_MODE*/)
.edit()
.putString("password", "new value")
.apply();
Docs mention 关于apply(),
将您的首选项更改从该编辑器提交回 它正在编辑的 SharedPreferences 对象。这原子地执行 请求修改,替换当前在 共享首选项。
请注意,当两个编辑器同时修改首选项时, 最后一个调用 apply 的获胜。
与 commit() 不同,它将其偏好写入持久化 同步存储,apply() 将其更改提交到内存中 SharedPreferences 立即但开始异步提交 磁盘,您将不会收到任何故障通知。如果另一个编辑 此 SharedPreferences 执行常规 commit() 而 apply() 是 仍然未完成,commit() 将阻塞,直到所有异步提交都完成 完成以及提交本身。
由于 SharedPreferences 实例是进程中的单例,因此它是 如果您是,可以安全地用 apply() 替换任何 commit() 实例 已经忽略了返回值。
您无需担心 Android 组件生命周期及其 与 apply() 写入磁盘的交互。该框架确保 来自 apply() 的动态磁盘写入在切换状态之前完成。
【讨论】: