SharedPreferences.Editor能否安全复用?多次调用apply()是否可行?
当然可以安全复用!不过得先搞懂它的工作逻辑,才能用得更踏实。
SharedPreferences.Editor 本质上是个编辑操作的临时容器:每次调用 apply() 或者 commit() 时,它会把当前攒的所有编辑操作提交到SharedPreferences里,提交完成后,这个Editor实例并不会失效——它会自动清空内部的操作队列,等着接收下一轮的put操作。
就拿你给出的代码例子来说:
val editor = prefs.edit() editor.putString("myString", "Some string").apply() // 一段时间后... editor.putInt("myInt", 682).apply()
这段代码完全没问题,两次apply()是独立的提交动作,不会互相干扰。第一次提交字符串后,Editor就已经准备好接受下一次的编辑指令了。
不过有两个小细节需要注意:
- 线程安全问题:Editor本身不是线程安全的,千万别在多线程环境下共享同一个实例。如果多个线程同时往这个Editor里加操作或者调用apply,很可能会出现操作覆盖、队列混乱的情况。这种场景下,建议每次需要编辑时都重新调用
prefs.edit()获取新实例。 - clear()的影响:如果在两次apply之间调用了
clear(),下一次的put操作会基于清空后的状态提交,这是符合预期的,不用担心复用会留下之前的操作残留。
其实从设计逻辑来看,官方就是支持Editor复用的——它的API链式调用(比如editor.putXxx().apply())本身就暗示了可以重复使用同一个实例来完成多轮编辑提交,只要遵循线程安全的原则,就不会有问题。
内容的提问来源于stack exchange,提问作者Graham Borland
相关产品推荐
相关产品推荐

