我对SharedPreferences in Android有一点怀疑。
要删除一个偏好,我们主要有两种选择:
第一:
SharedPreferences.Editor edit = (Editor) getSharedPreferences(Constants.APP_DEFAULT_PREF, MODE_PRIVATE).edit();
edit.putString(Constants.PREF_ACC, null);
edit.commit();第二:
SharedPreferences.Editor edit = (Editor) getSharedPreferences(Constants.APP_DEFAULT_PREF, MODE_PRIVATE).edit();
edit.remove(Constants.PREF_ACC);
edit.commit();在这两种情况下,从Constants.PREF_ACC中获取SharedPreferences值将返回null。
我想知道我该选哪一个。它们中是否有任何与内存相关的问题?他们的System.gc行为将是什么?
发布于 2016-03-24 17:15:51
理论上,remove优于put(null),因为它移除键和值(一旦提交),而不是映射(并保持)到空值的键。
但从Android 5.1.1的实现来看,它们是等价的:
...
String k = e.getKey();
Object v = e.getValue();
// "this" is the magic value for a removal mutation. In addition,
// setting a value to "null" for a given key is specified to be
// equivalent to calling remove on that key.
if (v == this || v == null) {
if (!mMap.containsKey(k)) {
continue;
}
mMap.remove(k);
} else {
...这也是putXXX方法(putStringSet)文档中所指出的:
为该参数传递null等同于使用此键调用remove(String)。
发布于 2016-03-24 16:01:07
我建议使用删除。
当我们不执行putString或删除时,它只是在编辑器中标记为要执行,并且只有在调用提交和调用提交时才会执行--所有的删除调用都在put调用之前执行。因此,最好使用remove调用从编辑器中删除某些内容。
发布于 2016-03-24 16:19:19
从文档的接口SharedPreferences.Editor来判断remove(String):
在编辑器中标记一个首选项值应该被删除,这将在调用commit()之后在实际的首选项中完成。 注意,当提交回首选项时,所有的删除都是首先完成的,无论是在此编辑器上调用put方法之前还是之后调用remove。
…对于putInt(int):
在preferences编辑器中设置一个int值,在调用commit()或apply()后将其写回。
…似乎只有一个显著的区别:remove(String) 调用将“首先执行,无论您是在put方法之前还是之后调用remove”。
尽管如此,我真的很怀疑实际的执行顺序对一般用例没有多大影响,所以您只需选择其中一种方法就可以了。
p.s.__,我仍然在寻找SharedPreferences.Editor的具体类,它可能会提供更多关于这方面的线索。一旦我找到一个就会更新。
https://stackoverflow.com/questions/36201201
复制相似问题