Установить <String> в android sharedpreferences не сохраняет силу

Я пытаюсь использовать androids sharedpreferences, я зарегистрировал все, а код ниже действительно выполняет набор строк. Проблема в том, что когда я принудительно закрываю приложение и начинаю заново, settings.getStringSet возвращает пустой набор. Нет ошибок в работе.

Я пробовал PreferenceManager.getDefaultSharedPreferences, но это тоже не работает для меня.

Спасибо за ваше время.

public static final String PREFS_NAME = "MyPrefsFile";
private static final String FOLLOWED_ROUTES = "followedRoutes";

и позже, когда вызывается сохранение:

public void onFollowClicked(View view){

SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();

Set<String> follows =  settings.getStringSet(FOLLOWED_ROUTES, new HashSet<String>());
follows.add(routeId);

editor.putStringSet(FOLLOWED_ROUTES, follows);
editor.commit();

}

Ответ 1

Посмотрите здесь.

Также для повторения:

SharedPreferences

SharedPreferences.Editor

EDIT:

На самом деле есть ошибка с этим, см. здесь. Выдержка оттуда:

Эта проблема все еще присутствует на уровне API API.

Это вызвано тем, что метод getStringSet() Класс SharedPreferences не возвращает копию объекта Set: it возвращает весь объект, и когда вы добавляете к нему новые элементы, Метод commitToMemory класса SharedPrefencesImpl.EditorImpl см. что существующее значение равно предыдущему сохраненному.

Способы решения этой проблемы - сделать копию набора возвращается SharedPreferences.getStringSet или принудительно записывается в памяти, используя другие предпочтения, которые всегда меняются (например, свойство, которое каждый раз хранит размер набора)

EDIT2:

Здесь может быть решение , посмотрите.

Ответ 2

Вы также можете обойти ошибку, указанную g00dy следующим образом:

Получить набор из sharedPreferences и сохранить его в переменной.

Затем просто удалите набор в sharedpreferences, прежде чем добавлять его при сохранении.

SharedPreferences.Editor editor= sharedPref.edit();
editor.remove("mSet");
editor.apply(); 
editor.putStringSet("mSet", mSet);
editor.apply();

Обязательно используйте apply() или commit() дважды.