Значение SharedPreferences не обновляется
Я пытаюсь обновить значения SharedPreferences, вот мой код:
edit = PreferenceManager.getDefaultSharedPreferences(this).edit();
edit.putString(Settings.PREF_USERNAME+"",txtuser);
edit.putString(Settings.PREF_PASSWORD+"",txtpass);
edit.commit();"
Проблема в том, что когда я обращаюсь к этим значениям, он не возвращает обновленные значения, он дает мне значение SharedPreferences.
Но когда я подтверждаю данные в файле XML, данные обновляются в этом.
И после перезагрузки моего приложения я получаю обновленные значения. Поэтому мне нужно перезапустить приложение для получения обновленных значений.
Итак, как получить эти обновленные значения после его изменения?
Заранее спасибо
Вот мой весь код:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
ctx=this;
status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// get old value
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
on(ctx,true);// function will call and value is updated
}
}});
status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// this should give me a updated value but gives old value
}
public static boolean on(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Settings.PREF_ON, Settings.DEFAULT_ON);
}
public static void on(Context context,boolean on) {
if (on) Receiver.engine(context).isRegistered(); //
}
**********in reciver file***********
public void isRegistered ) {
Editor edit = PreferenceManager.getDefaultSharedPreferences(Receiver.mContext).edit();
edit.putString(Settings.PREF_STATUS+"","0");
edit.commit();
}
Ответы
Ответ 1
Вместо использования edit.commit();
вы должны использовать edit.apply();
. Применить будет обновлять объект предпочтения мгновенно и будет сохранять новые значения асинхронно, поэтому вы сможете прочитать последние значения.
фиксации()
Скопируйте изменения настроек из этого редактора в Объект SharedPreferences, который он редактирует. Это атомически выполняет запрошенные изменения, заменяя все, что в настоящее время находится в SharedPreferences.
Обратите внимание, что когда два редактора изменяют настройки одновременно, последний из которых будет называться commit.
Если вам не нравится возвращаемое значение, и вы используете это из ваш основной поток приложения, рассмотрите вместо этого использование apply().
применить()
Скопируйте изменения настроек из этого редактора в Объект SharedPreferences, который он редактирует. Это атомически выполняет запрошенные изменения, заменяя все, что в настоящее время находится в SharedPreferences.
Обратите внимание, что когда два редактора изменяют настройки одновременно, последний, который вызывается, применяет выигрыши.
В отличие от commit(), который записывает свои предпочтения в постоянное хранение синхронно, apply() фиксирует свои изменения в памяти SharedPreferences немедленно, но начинает асинхронную фиксацию диск, и вы не будете уведомлены о каких-либо сбоях. Если другой редактор этот SharedPreferences выполняет регулярную фиксацию(), а apply() - все еще выдающийся, commit() будет блокироваться до тех пор, пока все асинхронные завершена, а также сама фиксация.
Поскольку экземпляры SharedPreferences - это одиночные элементы внутри процесса, это безопасно заменить любой экземпляр commit() с помощью apply(), если вы были уже игнорируя возвращаемое значение.
Вам не нужно беспокоиться о жизненных циклах компонентов Android и их взаимодействие с apply(), записывающее на диск. Эта структура гарантирует в полете записывает запись из apply() до состояния переключения.
Ответ 2
Попробуйте это,
public SharedPreferences prefs;
SharedPreferences.Editor editor = prefs.edit();
editor.putString(Settings.PREF_USERNAME+"", txtuser);
editor.putString(Settings.PREF_PASSWORD+"", entered_name);
editor.commit();
Ответ 3
надеюсь, что это поможет вам.
SharedPreferences mypref = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor prefsEditr = mypref.edit();
prefsEditr.putString("Userid", UserId);
prefsEditr.commit();
String task1 = mypref.getString("Userid", "");
Ответ 4
Попробуйте этот код:
SharedPreferences edit = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor1 = edit.edit();
editor.putString(Settings.PREF_USERNAME + "", txtuser);
editor.putString(Settings.PREF_PASSWORD + "", entered_name);
editor.commit();
Ответ 5
Хорошо, даже если мой ответ наступил через 3 года после вопроса, я надеюсь, что это поможет. Проблема, похоже, не связана с фиксацией или применением, а из структуры кода.
Объясните: на смартфоне вы запускаете APP, но вы не выходите из APP так же, как на компьютерах.
Это означает, что когда вы вернетесь в меню смартфона, APP все еще работает. Когда вы снова "click" на значке APP, вы не заново запускаете APP, а просто пробудите его.
В juned code мы видим, что он вызывает getDefaultSharedPreferences внутри своей функции Create.
Поэтому он вызывает getDefaultSharedPreferences, когда он запускает первый раз APP. Но когда он устанавливает APP на фоне, а затем пробуждает APP, вызов не выполняется.
У меня была та же проблема:
Я проверяю, есть ли у меня SharedPreference для моего APP. Если нет, я запрашиваю форму для запроса значения пользователю.
Если да, я проверяю дату настроек. Если слишком старый, я предлагаю форму.
После формы я сохраняю настройки с текущей датой.
Я заметил, что тест о существовании SharedPreference (который был установлен в том же месте, что и у juned) был сделан только при первом запуске APP, но не тогда, когда я пробуждаю APP. Это означает, что я не смог проверить время, ограниченное моими SharedPreferences!
Как это решить?
Просто добавьте:
@Override
public void onResume(){
super.onResume();
// And put the SharedPreferences test here
}
Этот код будет вызываться при первом запуске APP, но также каждый раз, когда пользователь его пробуждает.