Пакетируют ли они вызовы в очереди?
Нет, не делают.SharedPreferences
были разработаны для выполнения самых основных задач..apply()
должен быть последним оператором только при работе с SharedPreferences
.Таким образом, вы можете реорганизовать свой код, так как
sharedPreference = context.getSharedPreferences("pet-app-sp", Context.MODE_PRIVATE);
editor = sharedPreference.edit();
editor.clear(); //removed apply
editor.putInt(VERSION_NUMBER_PREFERENCE_KEY, versionCode).apply();
Вы также должны знать разницу между commit()
и apply()
apply()
, которые были добавлены в 2.3, они фиксируются без возвраталогическое значение, означающее успех или неудачу.
commit()
возвращает true, если сохранение выполнено, в противном случае - false.
apply()
был добавлен, поскольку команда разработчиков Android заметила, что почти никто не обратил внимания навозвращаемое значение, поэтому применение выполняется быстрее, поскольку оно асинхронно .
По существу, commit()
немедленно записывает измененное значение SharedPreference
в постоянное хранилище, с другой стороны, apply()
немедленно записать изменения в оперативную память SharedPreference
и запустить асинхронную фиксацию на диск.Вот почему в случае apply()
вы не будете уведомлены о неудаче или успехе ваших изменений, как в commit()
, который возвращает вам статус ваших изменений. Источник
А по поводу вопроса в комментариях:
почему код в вопросе не работает.Например, почему два последовательных вызова .apply () не работают?
Это может показаться довольно расплывчатым, но иногда при работе в асинхронном режиме вы не можете быть уверены в выводе, если вы сами этого не хотите.Не управляйте потоками или их очередью, поскольку, будучи асинхронными, существует вероятность того, что порядок двух операторов может измениться.Вот почему даже Владислав Матвиенко (в разделе комментариев вопроса) предложил вам использовать commit()
, который является синхронным и автоматически вызывает clear()
, или вы можете использовать мой ответ, то есть, удалив вызов .apply ().Проверьте документацию
Вы должны подумать, почему они перешли на .apply()
.Иногда разработчики заканчивают тем, что вставляют тонны данных через commit()
, который является синхронным и останавливает UI
/ Main
Thread