我在确定是否应该使用SharedPreferences.Editor中的apply()
或commit()
时遇到问题
由于apply()
是异步的,我们将在写入后立即阅读,因此使用commit()
会更安全。另一方面,此方法可能会阻止UI线程太长时间。我不想使用局部变量,因为我想阅读其他设置,因为我不知道将调用sendData()
的位置,通过设置和局部变量的读取组合将增加不必要的复杂性。
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Apply the edits!
editor.apply();
// Read data of SharedPreferences (including other previously data)
// and send to web service
sendData();
上面是我想要做的类似代码片段。我想确保当我从SharedPreferences读取任何数据时,所有设置都已提交。
答案 0 :(得分:1)
由于您不知道以及何时会调用sendData()
,因此您别无选择,只能使用commit
代替apply
,它会在您阅读时为您提供之前添加的数据并将其发送到外部服务器,但是如果仍然将数据放入磁盘但是您已经读取了数据,这将导致不一致的结果,它将异步执行。
通过在registerOnSharedPreferenceChangeListener
中使用侦听器SharedPreferences
,有一种方法可以知道存储数据。只有在您阅读之前始终知道最后添加到磁盘的数据时,这才会起作用。< / p>