Я использую общие предпочтения в своем приложении для Android. Я использую метод commit()
и apply()
из общих предпочтений. Когда я использую AVD 2.3, он не показывает ошибки, но когда я запускаю код в AVD 2.1, метод apply()
показывает ошибку.
Какая разница между этими двумя? И используя только commit()
можно ли сохранить значение предпочтения без каких-либо проблем?
Какая разница между commit() и apply() в общих предпочтениях
Ответ 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.
- Скорость:
apply()
быстрее. commit()
медленнее.
- Асинхронный против Синхронного:
apply()
: асинхронный commit()
: синхронный
- Atomic:
apply()
: атомарный commit()
: атомарный
- Уведомление об ошибке:
apply()
: нет commit()
: да