Я использую SharedPreferences
в моем приложении для Android. Я использую оба commit()
и apply()
метод из общих предпочтений. Когда я использую AVD 2.3, это не показывает ошибку, но когда я запускаю код в AVD 2.1, apply()
метод показывает ошибку.
Так в чем же разница между этими двумя? И с помощью только commit()
я могу сохранить значение предпочтения без каких-либо проблем?
android
sharedpreferences
Андро Сельва
источник
источник
apply()
будет асинхронно выполнять дисковый ввод-вывод, покаcommit()
он синхронный. Так что вам действительно не следует звонитьcommit()
из потока пользовательского интерфейса.apply()
побеждает последний из вызываемых объектов . Таким образом, вы можете использоватьapply()
вместоcommit()
безопасного, если вы уверены, что только одно SharedPreferences.Editor используется вашим приложением.commit()
?Ответы:
apply()
был добавлен в 2.3, он фиксирует без возврата логического значения, указывающего на успех или неудачу.commit()
возвращает true, если сохранение работает, иначе false .apply()
была добавлена, так как команда разработчиков Android заметила, что почти никто не обратил внимания на возвращаемое значение, поэтому применять быстрее, поскольку оно асинхронно.http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply ()
источник
ТЛ; др:
commit()
записывает данные синхронно (блокируя поток, из которого они вызваны). Затем он информирует вас об успехе операции.apply()
планирует данные для записи асинхронно . Он не информирует вас об успешности операции.apply()
и сразу прочитаете с помощью любого метода getX, новое значение будет возвращено!apply()
в какой-то момент и он все еще выполняется, любые вызовыcommit()
блокируются до тех пор, пока не завершатся все прошлые вызовы apply и текущий commit-вызов.Более подробная информация из документации SharedPreferences.Editor :
источник
apply()
он асинхронный, и ожидающие записи блокируют будущие вызовыcommit()
.У меня возникают некоторые проблемы с использованием apply () вместо commit (). Как указано ранее в других ответах, apply () является асинхронным. Я получаю проблему, что изменения, сформированные в предпочтении "набора строк", никогда не записываются в постоянную память.
Это происходит, если вы «принудительно задерживаете» программу или в ПЗУ, которое я установил на моем устройстве с Android 4.1, когда процесс прерывается системой из-за необходимости в памяти.
Я рекомендую использовать «commit ()» вместо «apply ()», если вы хотите, чтобы ваши настройки были активными.
источник
Используйте apply ().
Он немедленно записывает изменения в ОЗУ, а затем ожидает и записывает их во внутреннее хранилище (файл фактических настроек). Коммит записывает изменения синхронно и напрямую в файл.
источник
commit()
синхронно,apply()
асинхронноapply()
является пустой функцией.commit()
возвращает true, если новые значения были успешно записаны в постоянное хранилище.apply()
перед переключением состояний гарантия завершена, вам не нужно беспокоиться о жизненных циклах компонентов AndroidЕсли вы не используете значение, возвращаемое из,
commit()
и используетеcommit()
из основного потока, используйтеapply()
вместоcommit()
источник
Документы дают довольно хорошее объяснение разницы между
apply()
иcommit()
:источник
Из Javadoc:
источник
Мы можем быть смущены этими двумя терминами, когда мы используем SharedPreference. В основном они, вероятно, одинаковы, поэтому давайте выясним различия в commit () и apply ().
apply()
фиксирует без возврата логического значения, указывающего на успех или неудачу.commit(
) возвращает true, если сохранение работает, иначе false.apply()
быстрее.commit()
медленнее.apply()
: Асинхронныйcommit()
: синхронныйapply()
: атомнаяcommit()
: атомнаяapply()
: Нетcommit()
: даисточник
apply()
"быстрее", чемcommit()
? По сути, они представляют собой ту же задачу, которая будет поставлена в Looper потока.commit()
помещает эту задачу в основной Looper, аapply()
в фоновом режиме, тем самым освобождая главный петлитель от задачи дискового ввода-вывода.