Shared preference android fragment

Русские Блоги

Понимание и использование Android SharedPreferences

Пять методов хранения данных Android:

  1. SharedPreferences: хранить простые параметры конфигурации в виде карты;
  2. ContentProvider: предоставлять частные данные приложения другим приложениям;
  3. Файловое хранилище: хранится в виде потока ввода-вывода, который можно разделить на внутреннее и внешнее хранилище мобильного телефона (SD-карта и т. Д.), Который может хранить большие данные;
  4. SQLite: легкая кроссплатформенная база данных, все данные хранятся в одном файле на телефоне, занимая небольшой объем памяти;
  5. Сетевое хранилище: данные хранятся на сервере, и данные получаются при подключении к сети;

Sharedpreferences — это облегченный класс хранилища на платформе Android, используемый для хранения различной информации о конфигурации приложения. Его суть — XML-файл, который сохраняет данные в виде пар «ключ-значение». Файл хранится в / data / data // каталог shared_prefs. С точки зрения глобальных переменных, его преимущество состоит в том, что он не создает проблем с приложениями, статическими переменными OOM (нехватка памяти) и нулевым указателем. Его недостатком является то, что эффективность не так высока, как у двух вышеуказанных методов.

1. Получить SharedPreferences

Чтобы использовать SharedPreferences для хранения данных, вам сначала нужно получить объект SharedPreferences. Android в основном предоставляет три метода получения объектов SharedPreferences.

1.1 Метод getSharedPreferences () в классе Context:

Этот метод получает два параметра. Первый параметр используется для указания имени файла SharedPreferences. Если указанный файл не существует, будет создан один. Второй параметр используется для указания режима работы. В основном существуют следующие режимы на выбор. MODE_PRIVATE — это режим работы по умолчанию, и эффект такой же, как при прямой передаче 0.
Два режима MODE_WORLD_READABLE и MODE_WORLD_WRITEABLE объявлены устаревшими в Android 4.2.

1.2 Метод getPreferences () в классе Activity:

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

1.3 Метод getDefaultSharedPreferences () в классе PreferenceManager:

Это статический метод, который получает параметр Context и автоматически использует имя пакета текущего приложения в качестве префикса для имени файла SharedPreferences.

2. Использование SharedPreferences

Сам объект SharedPreferences может только получать данные и не поддерживает хранение и модификацию.Модификация хранилища реализуется через объект Editor внутреннего интерфейса, полученный SharedPreferences.edit (). Используйте Preference для доступа к данным, используйте интерфейс SharedPreferences и внутренний интерфейс SharedPreferences.Editor SharedPreferences, эти два интерфейса находятся в пакете android.content;

нота: Если вы используете SharedPreferences в Fragment, вам необходимо инициализировать SharedPreferences в onAttach (Activity activity), иначе он сообщит о нулевом указателе, то есть getActivity () может вернуть null!

Шаги по чтению и записи SharedPreferences для других приложений следующие:
1. При создании SharedPreferences укажите режим MODE_WORLD_READABLE, указывая, что данные SharedPreferences могут быть прочитаны другими программами;
2. Создайте контекст, соответствующий другим приложениям;
3. Используйте контекст других программ, чтобы получить соответствующие SharedPreferences;
4. Если вы пишете данные, просто используйте интерфейс редактора, и все остальные операции будут такими же, как и раньше;

3. Анализ исходного кода SharedPreferences (API 25)

GetSharedPreferences контекста:

Мы знаем, что класс Context в Android фактически использует шаблон декоратора, а украшенный объект на самом деле является объектом ContextImpl, методом getSharedPreferences ContextImpl:

Читайте также:  Блокировщик всей рекламы для андроид

Из вышесказанного мы можем видеть отношения между ними:
(ArrayMap )
mSharedPrefsPaths хранит сопоставление между именем и папкой. Имя здесь — это имя, передаваемое при использовании getSharedPreferences. Если mSharedPrefsPaths имеет значение null, оно будет инициализировано. Если значение файла равно null, создайте новый файл и Добавьте его в mSharedPrefsPaths;

( ArrayMap > )
sSharedPrefsCache сохраняет имя пакета и пару «ключ-значение» ArrayMap. по умолчанию будет использовать имя пакета в качестве ключа в паре «ключ-значение» во время инициализации. Обратите внимание, что это статическая переменная;

(ArrayMap )
sSharedPrefs packagePrefs сохраняет имя файла и пару «ключ-значение» SharedPreferencesImpl.

нота:

  1. Для того же имени SharedPreferences получается тот же объект SharedPreferences, который на самом деле является объектом SharedPreferencesImpl.
  2. sSharedPrefs статичен в программе.Если вы выходите из программы, но контекст не очищается, при следующем входе в программу вы все равно можете получить значение, которое должно было быть удалено. И переключитесь на другой способ очистки SharedPreferences: использование метода фиксации SharedPreferences.Editor может работать, и он вступит в силу немедленно, без выхода из программы после вызова.

SharedPreferencesImpl объект

Видно, что для имени файла SharedPreferences первый вызов getSharedPreferences создаст объект SharedPreferencesImpl, который запустит дочерний поток, а затем прочитает все пары ключ-значение в указанном файле SharedPreferences и сохранит их в Map. в.

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

Очевидно, что для ожидания этой блокировки используется метод awaitLoadedLocked. В конце метода loadFromDiskLocked мы также видим, что он вызывает метод notifyAll. В это время, если getString заблокирован ранее, он будет активирован. Тогда здесь возникнет проблема. Наша getString записана в потоке пользовательского интерфейса. Если getString заблокирована слишком долго, например 60 секунд, в это время произойдет ANR, поэтому мы должны решить, нужно ли нам читать и записывать SharedPreferences в соответствии с конкретной ситуацией. В дочернем потоке.

Что касается mBackupFile, SharedPreferences сначала переименует предыдущий XML-файл в файл резервной копии при записи, а затем запишет данные для записи в новый файл. Если процесс выполнен успешно, файл резервной копии будет сохранен. удалять. Видно, что даже если вы каждый раз просто добавляете пару ключ-значение, данные всего файла будут перезаписаны. Это также показывает, что SharedPreferences подходит только для сохранения небольшого объема данных, а размер файла слишком велик, и возникнут проблемы с производительностью.

нота:

  1. Вызов getXXX в потоке пользовательского интерфейса может вызвать ANR.
  2. Когда мы инициализируем объект SharedPreferencesImpl, мы добавляем все данные в XML-файл, соответствующий SharedPreferencesImpl, для загрузки в память. Если XML-файл большой, он будет занимать много памяти. Нам нужно только прочитать значение ключа в XML-файле. Но когда мы его получим, загрузится весь файл.
  3. Каждый раз, когда добавляется пара «ключ-значение», данные всего файла будут перезаписаны, а не добавочная запись; В итоге можно объяснить, что Sharedpreferences подходят только для облегченного хранилища.

Внутренний редактор классов SharedPreferences

Фактически, вы получаете объект EditorImpl, который является внутренним классом SharedPreferencesImpl:

Вы можете видеть, что у него есть объект карты mModified, который используется для сохранения «измененных данных», то есть каждый раз, когда вы вводите, вы помещаете только пару ключ-значение в этот mModified и, наконец, вызываете apply или commit, чтобы фактически поместить данные Запишите в файл, например, метод putString выше, и другие коды putXXX в основном такие же.

Разница между методом фиксации и методом применения

Оба метода сначала используют функцию commitTomemory для записи измененного содержимого в SharedPreferencesImpl, а затем вызывают enqueueDiskWrite для записи операции с диском. CommitToMemory создает «подходящий» объект mcr MemoryCommitResult, а затем этот объект необходимо передать при вызове enqueueDiskWrite, commitToMemory метод:

Читайте также:  Виджеты для android 4pda

Здесь вам нужно выяснить два объекта mMap и mModified: mMap предназначен для хранения пар ключ-значение в текущем файле SharedPreferences, а mModified — для хранения пар ключ-значение, введенных при редактировании в это время. mDiskWritesInFlight представляет количество операций, ожидающих записи.
Вы можете видеть, что этот метод сначала обрабатывает флаг очистки, он вызывает mMap.clear (), а затем проходит через mModified, чтобы поместить новую пару «ключ-значение» в mMap, что означает, что В транзакции фиксации, если вы поместите несколько пар ключ-значение и одновременно вызовете clear, а затем выполните фиксацию, тогда будут очищены только предыдущие пары ключ-значение, а пары ключ-значение, введенные в этот раз, все равно будут записаны.
При обходе mModified необходимо иметь дело со специальным случаем, то есть, если значение пары «ключ-значение» равно this (SharedPreferencesImpl) или null, это означает, что пара «ключ-значение» удалена. Это находится в методе удаления. Видно, что если раньше был такой же ключ и значение другое, старое значение перезаписывается новым значением, а если такой же ключ не существует, оно записывается полностью. Следует отметить, что здесь используется объект синхронного редактора блокировки, чтобы гарантировать правильное сохранение текущих данных.

Следующим шагом является вызов метода enqueueDiskWrite:

Определите задачу Runnable. В Runnable сначала вызовите writeToFile для выполнения операции записи. Операция записи должна сначала получить mWritingToDiskLock, что является блокировкой записи. Затем выполните mDiskWritesInFlight–, указав, что количество операций, ожидающих записи, уменьшается на 1.
Определите, является ли postWriteRunnable нулевым, нулевым при вызове фиксации и не нулевым при вызове apply. isFromSyncCommit имеет значение true, и необходимо выполнить операцию записи, затем вызовите writeToDiskRunnable.run (), обратите внимание, что этот вызов выполняется в текущем потоке. Если это не фиксация, то примените, затем вызовите QueuedWork.singleThreadExecutor (). Execute (writeToDiskRunnable). Этот класс QueuedWork на самом деле очень прост. Существует SingleThreadExecutor для асинхронного выполнения этого writeToDiskRunnable. Операция записи фиксации выполняется в вызывающем потоке. Выполнение и внутреннее применение реализовано с помощью пула однопоточных потоков, поэтому операции записи выполняются в дочерних потоках.

Резюме фиксации и применения:

  1. apply не имеет возвращаемого значения, а фиксация возвращает логическое значение, чтобы указать, успешно ли передана модификация;
  2. Фиксация — это синхронная отправка содержимого на жесткий диск, а применение apply немедленно отправляет изменения в память, а затем открывает асинхронный поток для отправки на жесткий диск, и если отправка не удалась, вы не получите никаких уведомлений.
  3. Вся отправка фиксации является синхронным процессом, и эффективность будет ниже, чем при применении асинхронной отправки.Если вас не заботит успех результата отправки, предпочтительнее применить метод.
  4. Apply — это запись на диск с использованием асинхронных потоков, а commit — синхронная запись на диск. Поэтому, когда мы используем фиксацию в основном потоке, нам нужно учитывать, будут ли проблемы с ANR. (Не подходит для больших хранилищ данных)

4. Просмотрите XML-файл, в котором Sharedpreferencesd сохраняет данные.

Если вы хотите просмотреть файл данных, вы должны сначала получить корневые права доступа мобильного телефона.После успешного рутирования измените права доступа к данным, чтобы просматривать базу данных в данных. Поскольку вы можете четко просматривать данные каждой пары «ключ-значение» в XML-файле, лучше всего зашифровать и сохранить наиболее важные данные с помощью Sharedpreferencesd. Успешный вид показан на следующем рисунке:

Метод изменения разрешения данных:

Когда вы используете команду ll или ls -la под Linux, вы увидите логотип вида drwxr-xr-x. Что это означает? Общая длина этого идентификатора составляет 10 цифр (10′- ‘), первая цифра указывает тип файла, если файл является файлом (обозначается -), если файл является папкой (Обозначается d), если файл является файлом подключения (обозначается l), следующие 9 разделены на три группы: первая группа: права пользователя, вторая группа: права группы, а третья группа: другие права. Каждая группа состоит из трех битов: чтение r, запись w и выполнение x. Эти разрешения могут быть представлены числами: r 4, w 2, x 1. Если ни одно из разрешений отсутствует, оно обозначается знаком «-». Например: 1. -rwxrwx —, первая буква «-» представляет файл, вторая — четвертая rwx представляет владельца файла, который прочитал, записал, Разрешения на выполнение, пользователи в той же группе также имеют разрешения на чтение, запись и выполнение, а другие группы пользователей не имеют разрешений. Если он представлен числами, это 770.
2. drwx ——, first’d ‘представляет папку, со второго по четвертый rwx представляет, что владелец этой папки прочитал, Разрешения на запись и выполнение. С пятого по седьмой представляют разрешения владельца и той же группы пользователей. У той же группы пользователей нет никаких разрешений. С восьмого по десятый представляют разрешения других пользователей, а у других пользователей нет. Никаких разрешений. Если выражается цифрами, это 700.

Читайте также:  Camscanner премиум для андроид

Источник

Android SharedPreferences using Kotlin

Android Tutorial

In this tutorial, we’ll learn how to implement SharedPreferences in our Android Application using Kotlin.

What is Android SharedPreferences?

SharedPreferences is part of the Android API since API level 1. It’s an interface that allows us to store/modify/delete data locally.

Generally, it is used to cache user local data such as login forms. The data is stored in the form of a key-value pair.

You can create multiple files to hold the SharedPreferences data.

SharedPreferences Methods

Let’s look at some important methods for SharedPreferences.

  • getSharedPreferences(String, int) method is used to retrieve an instance of the SharedPreferences .
    Here String is the name of the SharedPreferences file and int is the Context passed.
  • The SharedPreferences.Editor() is used to edit values in the SharedPreferences .
  • We can call commit() or apply() to save the values in the SharedPreferences file. The commit() saves the values immediately whereas apply() saves the values asynchronously.

SharedPreferences Setting/Retrieving Values using Kotlin

We can set values on our SharedPreference instance using Kotlin in the following way.

For retrieving a value:

The permitted types on a SharedPreference instance are:

Kotlin Code to Clear and Remove SharedPreferences Records

We can also clear all the values or remove a particular value by calling clear() and remove(String key) methods.

Note: Changes made to the editor after the commit or apply aren’t considered.

The above way to save and retrieve values from a SharedPreference is nearly the same as we do in Java.

So where’s the magic of Kotlin?

That’s what we’ll see next through an example android application.

Android SharedPreferences Kotlin Project Structure

In this application, we’ll have a login screen, which allows us to save/clear the form data.

1. Layout code

The code for the activity_main.xml layout file is given below.

2. MainActivity Kotlin Code

The code for the MainActivity.kt Kotlin class is given below.

Thanks to Kotlin Android Extensions, we don’t have to use findViewById for each XML view.

In the above code, we are creating a singleton class using the object keyword.

We are declaring an inline higher-order function named editMe(), which holds the logic for the edit operation.

We’ve created separate properties for each of the values. We are using the get and set Kotlin properties to retrieve and set the data in the shared preferences.

Kotlin has reduced the code verbosity and it looks much cleaner.

Furthermore, we can make it more concise by using another Kotlin higher-order function shown below.

And we do the following while setting the values:

This is as close as Kotlin can get you to the English Language.

The output of the above application in action is given below.

Источник

Оцените статью