Значение 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, но также каждый раз, когда пользователь его пробуждает.