Как SharedPreferences обрабатывает несколько вызовов .apply () один за другим? - PullRequest
0 голосов
/ 10 декабря 2018

Для небольшого требования мне нужно очистить SharedPreferences и сразу после этого вызова мне нужно сохранить значение типа int.Однако сохранение значения int не работает согласованно.

sharedPreference = context.getSharedPreferences("pet-app-sp", Context.MODE_PRIVATE);
editor = sharedPreference.edit();
editor.clear().apply();
editor.putInt(VERSION_NUMBER_PREFERENCE_KEY, versionCode).apply();

Итак, я хотел понять, как вызовы apply () работают асинхронно.Они пакетируют звонки в очереди?

Спасибо.

1 Ответ

0 голосов
/ 10 декабря 2018

Пакетируют ли они вызовы в очереди?

Нет, не делают.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

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