SharedPreferences не работает между действиями

Я пытаюсь сохранить некоторые фильтры/состояние в одном действии, а затем использовать эти данные в следующем действии.

Я использую SharedPreferences, но он работает не так, как я ожидал.


public class FilterActivity extends Activity {

  private static final String TAG = FilterActivity.class.getName();

  EditText distanceEditor;

  @Override
  public void onPause() {
    super.onPause();
    SharedPreferences preferences = getSharedPreferences(PreferenceKey.FILTER_PREFERENCES_NAME, MODE_WORLD_READABLE);
    String distance = distanceEditor.getText().toString();
    preferences.edit().putString(PreferenceKey.DISTANCE, distance);
    preferences.edit().commit();
    Log.i(TAG, "Wrote max-distance=" + distance);

    Log.i(TAG, "Preferences contains distance=" + preferences.getString(PreferenceKey.DISTANCE, "FAIL"));
  }


  public static class PreferenceKey {
    public static final String FILTER_PREFERENCES_NAME = "FilterActivity:" + "Filter_Preference_File";
    public static final String DISTANCE = "FilterActivity:" + "DISTANCE";
  }
}

Затем действие, которое должно использовать это предпочтение:


public class MapActivity  extends MapActivity {
  @Override
  public void onResume() {
    super.onResume();

    SharedPreferences preferences = getSharedPreferences(FilterActivity.PreferenceKey.FILTER_PREFERENCES_NAME, MODE_WORLD_READABLE);
    String maxDistance = preferences.getString(FilterActivity.PreferenceKey.DISTANCE, "FAIL");

    Log.i(TAG, "Read max-distance=" + maxDistance);
  }
}

Но вывод, который я получаю:


.FilterActivity( 4847): Wrote max-distance=99.9
.FilterActivity( 4847): Preferences contains distance=FAIL
.MapActivity( 4847): Read max-distance=FAIL

Может ли кто-нибудь сказать мне, что я делаю неправильно здесь?

Я разрабатываю против API Level-8.


person barryred    schedule 26.03.2011    source источник
comment
Это потому, что во втором действии вы запрашиваете RestaurantFilterActivity.PreferenceKey.DISTANCE, но в первом действии вы сохраняете его в FilterActivity.PreferenceKey.DISTANCE ? или это опечатка :-)   -  person Blundell    schedule 26.03.2011
comment
Ваш вывод журнала фактически показывает, что он не сохраняется с самого начала. Вы проверили Double.toString(distance); не нуль?   -  person Blundell    schedule 26.03.2011
comment
Опечатка, и исправлено в вопросе сейчас, извините.   -  person barryred    schedule 26.03.2011
comment
Вам нужны другие приложения, чтобы прочитать ваши предпочтения? Я бы просто 0 или MODE_PRIVATE для режима настроек. p.s. вам нужно .show() после Toast, чтобы просмотреть его.   -  person Blundell    schedule 26.03.2011
comment
Я бы также переместил super.onPause() в конец метода Activity. Поскольку вы хотите, чтобы код вашей активности выполнялся до того, как приложение начнет его очистку для паузы.   -  person Blundell    schedule 26.03.2011
comment
@Brundell: я сделал MODE общедоступным, так как он не работал в MODE_PRIVATE, и надеялся, что общедоступный режим может это исправить: это не так! Я вернусь к MODE_PRIVATE, как только он у меня сработает. Кроме того, я удалил тост из вопроса сейчас, так как это не относится к делу, но спасибо.   -  person barryred    schedule 26.03.2011


Ответы (1)


В следующих двух строках

preferences.edit().putString(PreferenceKey.DISTANCE, distance);
preferences.edit().commit();

возвращаются два разных SharedPreferences.Editor. Следовательно, значение не фиксируется. Вместо этого вы должны использовать:

SharedPreferences.Editor spe = preferences.edit();
spe.putString(PreferenceKey.DISTANCE, distance);
spe.commit();
person rajath    schedule 26.03.2011
comment
Это исправлено! Спасибо. Примеры, которые я видел, действительно использовали шаблон, который вы предлагаете, но не осознавали, что это требование. Дурак я. Спасибо! - person barryred; 26.03.2011
comment
Вы также можете использовать oneliner: preferences.edit().putString(PreferenceKey.DISTANCE, distance).commit(); - person ; 04.04.2015