Android - общие настройки иногда теряются - PullRequest
20 голосов
/ 30 октября 2011

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

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

Если у кого-то есть идея, чтобы я мог начать расследование, я был бы благодарен.

Спасибо, Амит Моран

Ответы [ 5 ]

16 голосов
/ 30 октября 2011

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

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

SP не предназначены для хранения данных, которые часто изменяются и / или больших объемов данных, и это плохая идея, чтобы попытаться сделать это (по причинам, которые вы обнаружили, и некоторые другие).

Помните, что SP на самом деле являются просто XML-файлом - вам приходится тратить время на синтаксический анализ и воссоздание, что каждый раз, когда вы меняете его тоже!

Идея приложения, которое обновляет SP более чем в одном потоке, немного сумасшедшая, я думаю - вам нужен лучший способ управления и хранения сохраняемых вами данных - он окупится для вас в более чем одном способ ...

6 голосов
/ 30 октября 2011

Согласно документации SharedPreferences.Editor :

Обратите внимание, что, когда два редактора изменяют настройки одновременно, побеждает последний, вызвавший принятие.

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

1 голос
/ 30 октября 2011

Я предлагаю вам использовать синглтон для управления настройками. Делаете ли вы это, внедряя true java singleton или используя Android Application Context , решать вам. (см. этот вопрос для нескольких хороших аргументов за / против каждого)

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

0 голосов
/ 15 декабря 2016

Я обнаружил, что теряю определенную запись в SharedPreferences, открыв редактор, выполнив getString для него, а затем committing, не выполнив сначала putString для записи, даже если не было необходимости менять. Как только я вставил putString, чтобы сохранить значение, несмотря ни на что, запись перестала исчезать после commit.

0 голосов
/ 23 марта 2012

У меня была похожая проблема: мои настройки не были надежно сохранены. На некоторых устройствах (в моем случае XOOM-Tablet) данные иногда терялись, а иногда нет. Я решил проблему, просто вызвав clear () в редакторе перед передачей новых данных.

Общие настройки теряются после выключения устройства или уничтожения приложения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...