С выпуском Gingerbread я экспериментировал с некоторыми новыми API, одним из которых был StrictMode .
Заметил, что одно из предупреждений для getSharedPreferences()
.
Это предупреждение:
StrictMode policy violation; ~duration=1949 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
и он предоставляется для getSharedPreferences()
вызова, выполняемого в потоке пользовательского интерфейса.
Должен ли SharedPreferences
доступ и изменения действительно производиться вне потока пользовательского интерфейса?
android
sharedpreferences
android-strictmode
хлопокШарикЛапы
источник
источник
Ответы:
Я рада, что вы уже играете с этим!
Несколько замечаний: (в форме ленивого маркера)
Что касается загрузки ...
после загрузки SharedPreferences являются одиночными и кэшируются для всего процесса. поэтому вы хотите, чтобы он был загружен как можно раньше, чтобы он был у вас в памяти до того, как он вам понадобится. (при условии, что он небольшой, как и должно быть, если вы используете SharedPreferences, простой XML-файл ...) Вы не хотите винить его в будущем, когда какой-то пользователь нажимает кнопку.
но всякий раз, когда вы вызываете context.getSharedPreferences (...), резервный XML-файл проверяется, изменился ли он, так что вы все равно захотите избежать этой статистики во время событий пользовательского интерфейса. Статистика обычно должна быть быстрой (и часто кешированной), но yaffs не имеет много возможностей для параллелизма (и многие устройства Android работают на yaffs ... Droid, Nexus One и т. Д.), Поэтому, если вы избегаете диска , вы избежите застревания за другими текущими или ожидающими дисковыми операциями.
поэтому вы, вероятно, захотите загрузить SharedPreferences во время onCreate () и повторно использовать тот же экземпляр, избегая статистики.
но если вам все равно не нужны ваши предпочтения во время onCreate (), это время загрузки излишне задерживает запуск вашего приложения, поэтому обычно лучше иметь что-то вроде подкласса FutureTask <SharedPreferences>, который запускает новый поток для .set () значение подклассов FutureTask. Затем просто ищите свой член FutureTask <SharedPreferences>, когда он вам нужен, и .get () его. Я планирую сделать это незаметно в Honeycomb бесплатно, прозрачно. Я постараюсь выпустить образец кода, который показывает лучшие практики в этой области.
Посетите блог разработчиков Android, чтобы узнать о предстоящих публикациях по темам, связанным со StrictMode, в ближайшие недели.
источник
Доступ к общим предпочтениям может занять некоторое время, поскольку они считываются из флэш-памяти. Вы много читаете? Возможно, тогда вы могли бы использовать другой формат, например, базу данных SQLite.
Но не исправляйте все, что вы найдете, с помощью StrictMode. Или процитируем документацию:
источник
Одна тонкость в ответе Брэда: даже если вы загружаете SharedPreferences в onCreate (), вам, вероятно, все равно следует читать значения в фоновом потоке, потому что getString () и т. Д. Блокируется до тех пор, пока не прочитает предпочтения общего файла в конце (в фоновом потоке):
edit () также блокируется таким же образом, хотя apply () кажется безопасным в потоке переднего плана.
(Кстати, извините, что записываю это здесь. Я бы поставил это как комментарий к ответу Брэда, но я только что присоединился и у меня недостаточно репутации для этого.)
источник
Я знаю, что это старый вопрос, но хочу поделиться своим подходом. Я долго читал и использовал комбинацию общих предпочтений и глобального класса приложения:
ApplicationClass:
LocalPreference:
MainActivity (действие, которое вызывается первым в вашем приложении):
Объяснение шагов:
ПРИМЕЧАНИЕ. ВСЕГДА проверяйте, не отличается ли переменная всего приложения от NULL, причина -> http://www.developerphil.com/dont-store-data-in-the-application-object/
Если бы я не проверял нулевое значение, я бы разрешил бросать нулевой указатель при вызове, например, getMaxDistance () объекта фильтра (если объект приложения был удален из памяти Android)
источник
Класс SharedPreferences выполняет некоторые операции чтения и записи в файлах XML на диске, поэтому, как и любая другая операция ввода-вывода, он может блокировать. Объем данных, хранящихся в настоящее время в SharedPreferences, влияет на время и ресурсы, потребляемые вызовами API. Для минимальных объемов данных получение / размещение данных занимает несколько миллисекунд (иногда даже меньше миллисекунды). Но с точки зрения эксперта может быть важно улучшить производительность, выполняя вызовы API в фоновом режиме. Для асинхронных SharedPreferences я предлагаю проверить библиотеку Datum .
источник