从SharedPreferences.Editor调用apply()后立即恢复首选项是否安全?

时间:2014-08-21 18:56:39

标签: android concurrency sharedpreferences

我在确定是否应该使用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读取任何数据时,所有设置都已提交。

1 个答案:

答案 0 :(得分:1)

由于您不知道以及何时会调用sendData(),因此您别无选择,只能使用commit代替apply,它会在您阅读时为您提供之前添加的数据并将其发送到外部服务器,但是如果仍然将数据放入磁盘但是您已经读取了数据,这将导致不一致的结果,它将异步执行。

通过在registerOnSharedPreferenceChangeListener中使用侦听器SharedPreferences,有一种方法可以知道存储数据。只有在您阅读之前始终知道最后添加到磁盘的数据时,这才会起作用。< / p>