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

Android - общие настройки иногда теряются

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

В соответствии с Документация SharedPreferences.Editor:

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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