SharedPreferences - Android

3

我对Android中的SharedPreferences有一点疑问。

要删除一个Preference,我们主要有两个选项:

第一:

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();

无论哪种情况,从SharedPreferences获取Constants.PREF_ACC值都将返回null。我想知道应该使用哪个选项?它们是否存在内存相关问题?使用它们时System.gc的行为会是什么样子?

你是在添加值到sharedPref之前获取吗? - Khizar Hayat
假设我已经设置了首选项值,访问了它,然后尝试删除它,因为它不再有效。如果需要,我们将再次尝试访问它。 - cprakashagr
那么两个选项都不错。 - Khizar Hayat
3个回答

1

从理论上讲,removeput(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 {
    ...

这也是putStringSet方法之一的文档所说的:
将null作为此参数传递相当于使用此键调用remove(String)。

0

我建议使用remove

当我们putStringremove时,什么也不会发生,它只是在编辑器中标记为待完成,并且只有在调用commit时才会执行。

当调用提交时,所有的删除调用都会在放置调用之前执行。因此,最好使用删除调用从编辑器中删除某些内容。


0
根据接口docs的判断,对于remove(String)

在编辑器中标记应该删除首选项值,在调用commit()后将在实际首选项中执行。

请注意,在提交回首选项时,所有删除都会首先执行,无论您是在put方法之前还是之后调用了remove方法。

对于putInt(int)

在首选项编辑器中设置int值,在调用commit()或apply()后写回。

看起来只有一个显著的区别:remove(String)调用将“首先执行,无论您是在put方法之前还是之后调用了remove方法”
话虽如此,我真的怀疑实际执行顺序对于平均使用情况并不重要,因此您可以选择其中任何一种方法,并且完全没有问题。

顺便说一下,我仍在寻找SharedPreferences.Editor的具体类,这可能会提供更多线索。一旦找到,我会尽快更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接