如何更改共享首选项中的值

sea*_*ean 21 java android sharedpreferences

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

Cri*_*ian 46

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();
Run Code Online (Sandbox Code Playgroud)

  • 最好使用editor.apply()异步执行提交 (5认同)

pul*_*ion 6

apply()而不是commit()

这是建议您使用Editor.apply()的,而不是commit()因为apply()异步式的作品,因此它不太可能会有因为这样可以ANR(如果有的话).

getSharedPreferences("FILE_NAME", 0 /*FILE_MODE*/)
     .edit()
     .putString("password", "new value")
     .apply();
Run Code Online (Sandbox Code Playgroud)

文档提到有关apply(),

将您的首选项更改从此编辑器返回到它正在编辑的SharedPreferences对象.这以原子方式执行请求的修改,替换SharedPreferences中当前的任何内容.

请注意,当两个编辑者同时修改首选项时,最后一个编辑应用获胜.

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

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

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