В чем разница между commit () и apply () в общих настройках - PullRequest
397 голосов
/ 11 мая 2011

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

Ответы [ 8 ]

612 голосов
/ 11 мая 2011

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

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

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

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

196 голосов
/ 11 мая 2011

tl; dr:

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

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

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

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

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

22 голосов
/ 17 декабря 2012

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

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

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

13 голосов
/ 27 марта 2013

Используйте применить ().

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

12 голосов
/ 22 апреля 2017
  • commit() синхронно, apply() асинхронно

  • apply() - пустая функция.

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

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

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

12 голосов
/ 11 мая 2011

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

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

6 голосов
/ 11 мая 2011

Из javadoc:

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

0 голосов
/ 02 июля 2019

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

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

1. Возвращаемое значение:

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

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

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

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

  1. Atomic:

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

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

apply(): Нет commit(): Да

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