Intereting Posts
EditText afterTextChanged не работает Программный скрининг на мобильном устройстве Вес устройства не работает с относительной компоновкой Как сохранить все методы в классе с помощью ProGuard Ссылки на скачивание виртуальных устройств GenyMotion Как создать интерфейс между фрагментом и адаптером? Галерея, как изображение с центральным увеличением изображения Почему я не могу использовать Resource.getSystem () без ошибки Runtime? Функция geocoder.getFromLocation выбрала исключение «Ожидание ответа сервера» Загрузка изображения с Android (с Android Asynchronous Http Client) на сервер rails (с помощью paperclip) Как получить все контакты, имя, фамилию, адрес электронной почты, номер телефона и т. Д. Без дубликатов Аудио-микшер в программном обеспечении Android Предупреждение о близости для местоположений, сохраненных на сервере Ошибка Null указателя с помощью hideSoftInputFromWindow SetCurrentItem в ViewPager не прокручивается сразу в правильном положении

В чем разница между 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()