SharedPreferences в Android Studio

28.11.2018 11:24, автор DiEitch

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

Однажды мне потребовалось узнать, было ли запущено моё приложение ранее, и SharedPreferences успешно меня выручил.

Чтобы эффективно работать с этим классом, нужно запомнить всего лишь несколько конструкций: инициализация, сохранение и восстановление.

Начнём с того, что нужно создать экземпляр SharedPreferences:

Я создал глобальный, т.к. мне нужно сохранять и ресторить настройки в разных местах приложения. Но инициализировать нужно обязательно в методе onCreate(). Попытка сделать так (не внутри onCreate)

вызовет крэш при запуске приложения по вполне очевидной причине: ничего пока не было создано, и получить, соотвественно, нечего.

Теперь посмотрим конструкцию восстановления данных:

.

В данном примере мы считываем имя файла, открытого в прошлой сессии, и удобнее использовать метод getString (), но существуют ещё несколько других:

Вернёмся к строке: curfilename=prefs.getString(APP_OPENED,"");. Первый параметр, это наименование поля в виде стандартной строки (как в ini файле в Windows), в котором хранится значение:

второй параметр предоставляет значение по умолчанию, если параметр не доступен (не был создан), в моём случае это пустая строка, по которой приложение определяет, что файл не был выбран.

С восстановлением вроде всё понятно, теперь разберёмся с сохранением. Сохранение немного сложнее за счёт вызова Editor.

Видно, что редактор выделил editor.commit(). Почему?

Дело в том, что в многопоточных приложениях (коим наше и является) не рекомендуется стопорить процессы, что и делает метод commit(), который пишет данные immediately (т.е. прямо при вызове), чем задерживает другие потоки. Видно, что редактор (и грамотные программисты тоже) настоятельно рекомендует вместо commit() применить метод apply(), который сделает то же самое, но в фоновом режиме.

Но если сохранить данные - срочное дело - иногда имеет смысл всё-таки применить commit(). 

При сохранении поля используются методы аналогичные методам при восстановлении: сохраняете значение String - должны прочитать его же. Интересным является метод getAll(), где можно использовать комбинированные типы, например <String, String>, но Editor не поддерживает метод putAll().

Надеюсь, что данная статья поможет начинающим программистам Андроид расширить и пополнить свои знания.