Какая разница между commit() и apply() в общих предпочтениях

Я использую общие предпочтения в своем приложении для Android. Я использую метод commit() и apply() из общих предпочтений. Когда я использую AVD 2.3, он не показывает ошибки, но когда я запускаю код в AVD 2.1, метод apply() показывает ошибку. Какая разница между этими двумя? И используя только commit() можно ли сохранить значение предпочтения без каких-либо проблем?

Ответ 1

apply() был добавлен в 2.3, он совершает без, возвращая логическое значение, указывающее на успех или неудачу.

commit() возвращает true, если сохранение работает, false в противном случае.

apply() был добавлен, поскольку команда разработчиков Android заметила, что почти никто не обратил внимание на возвращаемое значение, поэтому применение выполняется быстрее, так как оно асинхронно.

http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()

Ответ 2

ТЛ; др:

  • commit() записывает данные синхронно (блокируя вызываемый поток из). Затем он информирует вас об успешности операции.
  • apply() расписывает данные, которые должны быть записаны асинхронно. Он не информирует вас об успехах операции.
  • Если вы сохраните с помощью apply() и сразу прочитаете с помощью любого метода getX, новое значение будет возвращено!
  • Если вы вызвали apply() в какой-то момент и все еще выполняете, любые вызовы commit() будут заблокированы до тех пор, пока не будут завершены все прошлые обратные вызовы и текущий коммит-вызов.

Более подробная информация из SharedPreferences.Editor Документация:

В отличие от commit(), который синхронно записывает свои предпочтения в постоянное хранилище, apply() немедленно выполняет изменения в операциях SharedPreferences в памяти, но начинает асинхронную фиксацию на диск, и вы не будете уведомлены о каких-либо сбоях. Если другой редактор этой SharedPreferences выполняет регулярную фиксацию(), а apply() все еще неактивен, commit() будет блокироваться до тех пор, пока все асинхронные транзакции не будут завершены, а также сам commit.

Поскольку экземпляры SharedPreferences являются одиночными в рамках процесса, безопасно заменять любой экземпляр commit() с помощью apply(), если вы уже игнорировали возвращаемое значение.

Интерфейс SharedPreferences.Editor, как ожидается, не будет реализован напрямую. Однако, если вы ранее реализовали его и теперь получаете ошибки в отношении missing apply(), вы можете просто вызвать commit() из apply().

Ответ 3

У меня возникают некоторые проблемы с помощью apply() вместо commit(). Как указано ранее в других ответах, apply() является асинхронным. У меня возникает проблема, что изменения, сформированные в предпочтении "набор строк", никогда не записываются в постоянную память.

Это происходит, если вы "задерживаете" программу или, в ПЗУ, который я установил на своем устройстве с Android 4.1, когда процесс был убит системой из-за необходимости в памяти.

Я рекомендую использовать "commit()" вместо "apply()", если вы хотите, чтобы ваши настройки были живы.

Ответ 4

Используйте apply().

Он немедленно записывает изменения в ОЗУ и ждет и записывает их во внутреннюю память (фактический файл предпочтений) после. Commit записывает изменения синхронно и непосредственно в файл.

Ответ 5

Документы дают довольно хорошее объяснение разницы между apply() и commit():

В отличие от commit(), который синхронно записывает свои предпочтения в постоянное хранилище, apply() немедленно фиксирует свои изменения в SharedPreferences в памяти, но запускает асинхронную фиксацию на диск, и вы не будете уведомлены о каких-либо сбоях. Если другой редактор в этом SharedPreferences выполняет обычную commit() а apply() еще не выполнено, commit() будет блокироваться до тех пор, пока не будут выполнены все асинхронные коммиты, а также сам коммит. Поскольку экземпляры SharedPreferences являются синглетонами внутри процесса, можно безопасно заменить любой экземпляр commit() на apply() если вы уже игнорировали возвращаемое значение.

Ответ 6

  • commit() синхронно, apply() является асинхронным

  • apply() является функцией void.

  • commit() возвращает true, если новые значения были успешно записаны в постоянное хранилище.

  • apply() гарантирует завершение перед переключением состояний, вам не нужно беспокоиться о жизненных циклах компонентов Android.

Если вы не используете значение, возвращаемое из commit(), и вы используете commit() из основного потока, используйте apply() вместо commit()

Ответ 7

Из javadoc:

В отличие от commit(), который записывает предпочтения к постоянному хранению синхронно, apply() фиксирует изменения в памяти SharedPreferences немедленно, но запускает асинхронную фиксацию на диск и вы не будете уведомлены о каких-либо неудачи. Если другой редактор этой SharedPreferences выполняет регулярную фиксацию(), в то время как a > apply() все еще неактивен, commit() будет блокироваться до тех пор, пока все асинхронные коммиты не будут завершены, а также сам commit

Ответ 8

Разница между commit() и apply()

Мы можем быть смущены этими двумя терминами, когда мы используем SharedPreference. В основном они, вероятно, одинаковы, поэтому давайте выясним различия в commit() и apply().

1. Возврат стоимости:

apply() фиксирует, не возвращая логическое значение, указывающее успех или неудачу. commit() возвращает true, если сохранение работает, иначе false.

  1. Скорость:

apply() быстрее. commit() медленнее.

  1. Асинхронный против Синхронного:

apply(): асинхронный commit(): синхронный

  1. Atomic:

apply(): атомарный commit(): атомарный

  1. Уведомление об ошибке:

apply(): нет commit(): да