Intereting Posts
Как остановить службу Как изменить цвет кнопки цвета при нажатии на Android? Android: java.land.NoSuchFieldError после обновления до SDK 23 View.getViewTreeObserver (). AddOnGlobalLayoutListener утечки Фрагмент Как открыть сайт при нажатии кнопки в приложении Android? Butterknife не может связываться внутри моего адаптера Как создать обратные вызовы между кодом Android и собственным кодом? Как запустить локальное сетевое подключение программно через точку доступа Wi-Fi на Android? Как установить эффект пульсации на textview или изображение на Android? Программно задавать маржу / заполнение текстового поля в виде списка Клавиатура bluetooth приведет к разрушению и восстановлению активности Изображения изображений на Android ImageGetter, перекрывающиеся Обнаружение вращения главного экрана Android Можно ли сделать эту анимацию для Android с помощью ViewPager? Android.database.sqlite.SQLiteException: нет такого столбца: aa:, при компиляции: выберите Name from stud Где Address = aa

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

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

Solutions Collecting From Web of "В чем разница между commit () и apply () в общих предпочтениях"

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() будут блокироваться до тех пор, пока все заявки-призывы и его собственная фиксация не будут завершены.

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

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

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

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

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

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

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

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

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

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

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

Из javadoc:

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

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

  • apply() – это функция void.

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

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

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