Подтвердить что ты не робот

Контекст приложения SharedPreferences и контекст активности

Я использую несколько SharedPreferences для хранения данных в своем приложении. Некоторые предпочтения используются во многих действиях.

Я знаю, что SharedPreferences внутренне поддерживаются картой для быстрого доступа к чтению и записываются на SD-карту при изменении настроек.

Интересно, какой путь лучше, если доступ к sharedpreference осуществляется из-за большого количества действий:

  • Создайте его в каждом действии, используя контекст активности.
  • Мгновенное действие в каждом действии, но с использованием контекста приложения.
  • Поместите его, например. класс Application и экземпляр его только один раз там, похожий на синглтон.

Если я использую 1. решение, есть ли объект sharedpreference для каждого действия? И будет ли разрушена внутренняя карта sharedpreference при уничтожении активности?

Если я использую 2. решение, будет только один экземпляр, хотя я вызываю getSharedPreferences в каждом действии? И будет ли внутренняя карта в памяти до тех пор, пока приложение будет живым?

Надеюсь, кто-то знает, как Android его обрабатывает внутри.

4b9b3361

Ответ 1

Стоит рассмотреть источники , которые показывают, что экземпляр Context (будь то экземпляр Activity или Application), совместно использовать одну и ту же статическую карту HashMap<String, SharedPreferencesImpl>.

Поэтому всякий раз, когда вы запрашиваете экземпляр SharedPreferences с тем же именем через Context.getSharedPreferences(name, mode), вы получаете тот же самый экземпляр, так как он сначала проверяет, содержит ли карта уже экземпляр SharedPreferences для ключа (который является переданным именем). Когда экземпляр SharedPreferences загружен, он не будет загружен снова, а вместо него будет сделан с карты.

Так что на самом деле неважно, в какую сторону вы идете, важно использовать одно и то же имя, чтобы получать одинаковые префизы из разных частей приложения. Однако создание единой "точки доступа" для префов может быть плюсом. Таким образом, это может быть оболочка singleton над префиксами, созданными в Application.onCreate().

Ответ 2

SharedPreferences управляются внутри Android как одиночные. Вы можете получить столько случаев, сколько хотите:

context.getSharedPreferences(name, mode);

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

Ответ 3

Я предпочитаю использовать класс singleton для предпочтения, инициализировать предпочтение один раз по контексту приложения. создавать методы getter и setter (get/put) для добавления, обновления и удаления данных.

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