Android: la preferencia de conjunto de cadenas no es persistente

Tengo un problema con el almacenamiento de preferencias de conjunto de cadenas. Tengo estos métodos de utilidad para el almacenamiento:

public static void putStringSet(SharedPreferences pref, Editor e, String key, Set<String> set)
{
    if (Utils.isApiLevelGreaterThanGingerbread())
    {
        // e.remove(key); // I tried to remove it here
        e.putStringSet(key, set);
    }
    else
    {
        // removes old occurences of key
        for (String k : pref.getAll().keySet())
        {
            if (k.startsWith(key))
            {
                e.remove(k);
            }
        }

        int i = 0;
        for (String value : set)
        {
            e.putString(key + i++, value);
        }
    }
}

public static Set<String> getStringSet(SharedPreferences pref, String key, Set<String> defaultValue)
{
    if (Utils.isApiLevelGreaterThanGingerbread())
    {
        return pref.getStringSet(key, defaultValue);
    }
    else
    {
        Set<String> set = new HashSet<String>();

        int i = 0;

        Set<String> keySet = pref.getAll().keySet();
        while (keySet.contains(key + i))
        {
            set.add(pref.getString(key + i, ""));
            i++;
        }

        if (set.isEmpty())
        {
            return defaultValue;
        }
        else
        {
            return set;
        }
    }
}

Yo uso estos métodos para ser compatible con versiones anteriores de GB. Pero tengo un problema que usar el método putStringSet no es persistente para API> gingerbread. Es persistente mientras la aplicación se está ejecutando. Pero desaparece después de reiniciar. Voy a describir los pasos:

Instalación limpia de la aplicación - no hay preferencia con la tecla XAlmaceno el conjunto de cadenas A con la clave X - la preferencia contiene AAlmaceno el conjunto de cadenas B con la clave X - la preferencia contiene BCerrar appReinicio de la aplicación - la preferencia contiene AAlmaceno el conjunto de cadenas C con la clave X - la preferencia contiene CCerrar appReinicio de la aplicación - la preferencia contiene A

Así que solo el primer valor es persistente y no puedo sobrescribirlo.

Otras notas:

este método simplemente reemplaza putStringSet y getStringSet. Así que uso commit () ... pero en otros lugares (vea el ejemplo a continuación).Intenté reemplazar a commit () con apply (), pero no tuve éxitoCuando uso el código para las API más antiguas en las API más nuevas (comenté las primeras 4 líneas en ambos métodos) funciona perfectamente pero no es tan eficiente

Ejemplo de uso:

Editor e = mPref.edit();
PreferencesUtils.putStringSet(mPref, e, GlobalPreferences.INCLUDED_DIRECTORIES, dirs);
e.commit();

Muchas gracias por la ayuda.

Respuestas a la pregunta(2)

Su respuesta a la pregunta